• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Ofstream не пишет в файл

  • Автор темы Sporco
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Sporco

У меня есть форма, в которой вводятся данные для расчёта. Эти данные можно ввести вручную или прочитать из файла, а также записать в файл, всё работает нормально.

После расчета выводится вторая форма, в которой отображены результаты расчетов. Мне нужно сохранить эти результаты.

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

Код функции, которая должна сохранять результаты:

C++:
void SaveResultInFile(void)
{
//Описание данных
ofstream F;

//Открытие файла для записи
F.open("result.txt",ios::app);

//Сохранение данных
F<<"SaveResult";

//Закрытие
F.close();
}

Может кто-нибудь знает что надо сделать, чтобы запись происходила?
 
I

ierofant

Попробуйте:
C++:
F.open("result.txt", ios::app | ios::out);
 
S

Sporco

К сожалению также не работает.

Вставил после открытия файла код

C++:
if(!F) ShowMessage("Ошибка открытия");

Ошибки не выдает, следовательно, как понимаю, файл он открывает и с потоком связывает.

Вывел в watch то, что содержится в потоке:

F: { { { 4096, :00000450, NULL, 17, '\x01', '\x01', '\x01' }, '\x01', '\x01', '\x01', '\0', '\x01', '\0', '\0', "aveResult", "\x06\x10", "ґfТ", "м:~", NULL, NULL, { { 0 } }, ... }, ????, ????, ????, true, ????, ????, ????, ????, ????, ????, ????, ????, ????, ????, ... }

Как понимаю, и в поток он помещает то, что надо. Правда настораживает, что первая буква пропала...

А дальше идет операция закрытия файла... Не могу понять почему не записывает...

UPD: Все-таки файл похоже не открывает... удалил файл result.txt и запустил. Должен был создать файл, но этого не произошло. Значит проблема где-то месте создания/связки файла и потока.

UPD2: Удалил файл и вставил GetLastError. Возвращает 183-ю ошибку (Cannot create a file when that file already exists.), хотя файла нет! Если данные не считывать из файла в первой форме, то возвращает 0 и файл создает. В полном тупике. o_O

UPD3: Попробовал повставлять эту функцию сохранения в разные части кода, заметил, что она работает только до вызова OpenDialog при считывании данных:

C++:
void __fastcall TfmEnter::mmLoadClick(TObject *Sender)
//Функция для загрузки данных из файла
{
//SaveResultInFile();  тут еще работает

//Открытие окна диалога
odForListOfDates->Execute();

//SaveResultInFile();  тут уже не работает

//Выбор файла с данными
FileNameOfDates=odForListOfDates->FileName;

//Загрузка
ReadDatesFromFile(); //но эта функция работает нормально, хотя в ней тоже используeтся поток (ifsteam)
}
 
I

ierofant

Попробуйте писать полный путь к файлу.
 
S

Sporco

Попробуйте писать полный путь к файлу.
Да! Заработало! В папке, где хранились данные нашел result.txt, со всеми своими предыдущими тестами. OpenDialog похоже задавал папку с данными как папку в которую надо сохранять файл с результатами

Спасибо огромное за помощь! :(

Зато на всю жизнь запомнил! )
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!