2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Пересоздать файл C++
Сообщение06.06.2015, 11:55 


24/07/14
138
Задача по сути в том, чтобы вывести какой-то большой результат по частям. Вместо одного большого файла, выводится, например, 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 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Пока не пришёл модератор, срочно сделайте так:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


24/07/14
138
whitefox да что-то тема случайно отправилась до того как я все дописал. Вопрос теперь в конце первого сообщения. А как вы сделали именно синтаксис C++?
------
Все, уже увидел как.

 Профиль  
                  
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:39 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Out<<...//Запись данных Эта строка не лишняя?

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

 Профиль  
                  
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 12:53 


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

 Профиль  
                  
 
 Re: Пересоздать файл C++
Сообщение06.06.2015, 13:45 
Заслуженный участник
Аватара пользователя


19/12/10
1546
_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 


24/07/14
138
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group