2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Пересоздать файл C++
Сообщение06.06.2015, 11:55 
Задача по сути в том, чтобы вывести какой-то большой результат по частям. Вместо одного большого файла, выводится, например, 100 небольших.
Код примерно такой:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
Nt=100;
NtCut=10;
jpart=1;

ofstream Out("part 1.txt", ios::binary);

Out<<...//Запись каких-то начальных данных в файл
//будем считать, что файл состоит из строк с числами

for (int j = 1; j < Nt; j++)
        {
Out<<...//Запись данных
       
         if (j%NtCut == 0)
                {
                        Out.close();
                        jpart++;
                       
                        ofstream Out("part " + to_string(jpart) + ".txt", ios::binary);
                        Out <<... //Новый файл должен начинаться с той же строки, которой заканчивался старый
                }
         }

Проблема в следующем: новый файл не виден в основном цикле. В "part1.txt" записывается все как надо, а в остальные записывается только одна строка, вывод которой идет сразу после открытия файла. Можно ли как-то сделать новый файл доступным вне if (j%NtCut == 0){...} ?
Можно ли сделать так чтобы

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:04 
Аватара пользователя
Пока не пришёл модератор, срочно сделайте так:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
Nt=100;
NtCut=10;
part=1;
ofstream Out("part 1.txt", ios::binary);

Out<<...//Запись каких-то начальных данных в файл

for (int j = 1; j < Nt; j++)
{
Out<<...//Запись данных
if (j%NtCut == 0)
{
jpart++;
ofstream OutCut(timestring + "phi4 oscillon Data - part " + to_string(jpart) + ".txt", ios::binary);
for (int i = Nx / 2 - NxCut; i < Nx / 2 + NxCut + 1; i = i + kx)
OutCut << u[2][i] << " ";
OutCut << "\n";
}

Да и в чём, собственно, у Вас вопрос?

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:08 
whitefox да что-то тема случайно отправилась до того как я все дописал. Вопрос теперь в конце первого сообщения. А как вы сделали именно синтаксис C++?
------
Все, уже увидел как.

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:39 
Аватара пользователя
Out<<...//Запись данных Эта строка не лишняя?

Out.close(); Как думаете, какой файл закрывает эта команда? Может её лучше поставить сразу за вводом данных в "patr1.txt"? Файл внутри блока if закрывать не обязательно, он будет закрыт автоматически при выходе из блока. И может, всё таки, эту файловую переменную переименуете, например в NextOut?

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:53 
whitefox в сообщении #1023931 писал(а):
Out<<...//Запись данных Эта строка не лишняя?
Нет. Это запись основной части данных в файл. Запись внутри блока if нужна только для того чтобы еще раз записать текущую строку, только теперь уже в начало нового файла
whitefox в сообщении #1023931 писал(а):
Out.close(); Как думаете, какой файл закрывает эта команда?
Сейчас она закрывает как раз только "part 1.txt" как я понял.
whitefox в сообщении #1023931 писал(а):
Файл внутри блока if закрывать не обязательно, он будет закрыт автоматически при выходе из блока.
Вот в этом видимо вся проблема. Можно ли при выходе из блока оставить файл открытым?

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 13:45 
Аватара пользователя
_Er в сообщении #1023935 писал(а):
Вот в этом видимо вся проблема. Можно ли при выходе из блока оставить файл открытым?

Если Вы планируете использовать переменную (в том числе и файловую) вне блока, то и определять её нужно вне блока. Вне своего блока переменные не то, чтобы не видны, а вовсе не существуют. И при каждом входе в блок, объявленная в нём переменная создаётся заново, а при выходе из блока — уничтожается.

-- 06 июн 2015, 14:02 --

_Er в сообщении #1023935 писал(а):
Нет. Это запись основной части данных в файл.
У Вас запись в файл "part1.txt" производится в двух местах — вне цикла, и в каждой итерации цикла. При первой итерации, внутри блока if команда Out.close() закроет файл "part1.txt", но внешняя файловая переменная с этим именем остаётся, просто она уже не связана ни с каким файлом. Затем Вы объявляете внутри блока if локальную переменную с тем же именем Out, до конца блока она будет перекрывать внешнюю переменную. При выходе из блока локальная переменная Out будет уничтожена, а внешняя снова войдёт в область видимости, но она по-прежнему не связана ни с одним файлом. При следующей итерации Вы выводите какие-то данные в эту переменную, то есть в никуда. Вот я и спросил — эта строка не лишняя?

-- 06 июн 2015, 14:14 --

Возможно Вам нужно внутри блока if не создавать локальную переменную с тем же именем Out, а связать внешнюю переменную Out с новым файлом? Если так, то замените ofstream Out("part " + to_string(jpart) + ".txt", ios::binary); на Out.open("part " + to_string(jpart) + ".txt", ios::binary);

 
 
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 17:08 
whitefox в сообщении #1023949 писал(а):
Возможно Вам нужно внутри блока if не создавать локальную переменную с тем же именем Out, а связать внешнюю переменную Out с новым файлом? Если так, то замените ofstream Out("part " + to_string(jpart) + ".txt", ios::binary); на Out.open("part " + to_string(jpart) + ".txt", ios::binary);
Да, с open вроде все работает как надо. Спасибо!

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group