2010-06-24 3 views
7

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

#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 к тексту), он работает. Я также попытался промыть поток, но это не сработало.

Любые предложения?

+2

Как проверить полученный файл? – log0

+1

Программа Debian/Sid с g ++ 4.4.4 работает так, как ожидалось, и file.out содержит строку (без новой строки). Попробуйте обновить свой компилятор или ОС - оба устарели. – Dummy00001

+1

Как вы проверяете, является ли файл пустым?Сделайте это в результирующем файле: wc и посмотрите, что это такое. Он должен быть 0 2 11. 0 строк, 2 слова, 11 символов. Без новой строки выход «Hello world» будет запущен в ваше приглашение, так что вам может просто не хватать его. –

ответ

7

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

+3

Да, попробуйте сделать 'cat file; echo'. Не бессмысленно использовать 'endl'. Я ненавижу код, который использует эту туповатую конструкцию, и я хочу, чтобы люди стандартов удаляли его со стандарта. Промывка дорогая, и ее всегда следует делать сознательно и с предусмотрительностью. – Omnifarious

+0

Проблема заключалась в том, что в моей работе использовался багги-редактор, который не показывает строку, если в конце нет «\ n». Очевидно, vi показывает это правильно. Спасибо. –

0

ли

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

работу?

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

4

Не знаю, если это то, что вы пробовали, но вы должны сделать:

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

Update; Я оставляю этот ответ здесь из-за полезные замечания

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

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

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

+2

Деструктор 'ofstream' должен автоматически очищаться. – Omnifarious

+0

@Omnifarious: Это заслуживает понижения? Мой ответ * неправильный *? –

+1

@John Weldon - Это неправильно, потому что на самом деле это не проблема фактической проблемы OP. Это может быть полезно при отладке и выяснении, какова реальная проблема (и должна ли она быть комментарием), но сама по себе не является решением. Если это подразумевается как решение, оно предлагает решение стиля грузового культа, в котором один вводит код, не понимая, почему он должен быть там. – Omnifarious

4

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

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

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

2) Как-то программа вылетает перед ее выходом?

+0

Да, если заданная программа запускается и после того, как она полностью закончена, и вы получите свое приглашение обратно, она не содержит данных, там где-то есть ошибка. – Omnifarious

Смежные вопросы