ofstream не смывает - PullRequest
       2

ofstream не смывает

9 голосов
/ 24 июня 2010

У меня есть следующий код, работающий на Suse 10.1 / G ++ 4.1.0, и он не пишет в файл:

#include <fstream>
#include <iostream>

int main(){
    std::ofstream file("file.out");
    file << "Hello world";
}

Файл правильно создан и открыт, но пуст. Если я изменю код на:

#include <fstream>
#include <iostream>

int main(){
    std::ofstream file("file.out");
    file << "Hello world\n";
}

(добавить \n к тексту), все работает. Я также пытался очистить поток, но это не сработало.

Есть предложения?

Ответы [ 5 ]

8 голосов
/ 24 июня 2010

Если вы проверите свой файл с помощью cat, это может быть ваша оболочка, которая неправильно настроена и не печатает строку, если нет конца строки.
std::endl добавляет \n и флеш.

5 голосов
/ 24 июня 2010

Деструктор должен очистить и закрыть файл.

Я почти уверен, ошибка в другом месте, либо

1) Вы не проверяете вправильный момент времени.В какой момент вы сравниваете содержимое файла, «после» выхода, или вы устанавливаете точку останова до выхода из программы, а затем проверяете содержимое файла?

2) Каким-то образом программа падает перед этимвыходит

5 голосов
/ 24 июня 2010

Не знаю, пытался ли ты это сделать, но ты должен сделать:

file << "Hello World" << std::flush;

Обновление ; Я оставляю этот ответ здесь из-за полезных комментариев

На основе отзывов я изменю свой совет: вам не нужно явно вызывать std::flush (или file.close() в этом отношении), потому что деструктор сделает это за вас.

Кроме того, вызов flush явно вызывает операцию ввода-вывода, которая может быть не самым оптимальным способом. Откладывание на базовые iostreams и операционную систему будет лучше.

Очевидно, что проблема OP не была связана с вызовом или не вызовом std::flush, и, вероятно, была связана с попыткой прочитать файл до вызова деструктора файлового потока.

0 голосов
/ 16 мая 2018

Вы работаете в Linux, которая является POSIX-совместимой системой. Стандарт POSIX определяет, что такое строка :

Последовательность, состоящая из нуля или более не-символов новой строки плюс завершающий символ новой строки.

Таким образом, без символа новой строки файл содержит 0 строк и поэтому является пустым.

0 голосов
/ 24 июня 2010

ли

file << "Hello world" << std::endl;

работа

endl вставляет новую строку и очищает буфер. Это то, что вы имели в виду, когда сказали, что уже пытались очистить его?

...