fstream не печатает в файл - PullRequest
       5

fstream не печатает в файл

0 голосов
/ 23 февраля 2012

Следующий код напечатает что-то в файл

    std::fstream fout ("D_addr.txt", std::fstream::app);
    fout <<  pkt->Addr() << std::endl;
    flush(fout);
    fout.close();

Во время отладки я наблюдал pkt->Addr(), и у него есть некоторые значения.Строка fout передается без проблем.Также создается файл D_addr.txt.Однако после закрытия файла размер файла равен нулю!ничего не было написано.

В чем проблема?

Ответы [ 3 ]

4 голосов
/ 23 февраля 2012

Полагаю, это не ваш настоящий код, и в противном случае я бы начал с вашей функции Addr().

Обратите внимание, что fstream :: close "закрываетсяфайл, в настоящее время связанный с объектом, отсоединяющий его от потока. Любая ожидающая последовательность вывода записывается в физический файл. " flush(fout); может быть опущено.

Также необходимо указать флаг std::fstream::out. "Если функция вызывается с любым значением в этом параметре, режим по умолчанию переопределяется, а не комбинируется." Поэтому вместо std::fstream::app вы должны передать std::fstream::app | std::fstream::out.

2 голосов
/ 23 февраля 2012

Прежде всего, flush() и fout.close() не причиняют никакого вреда, но здесь не нужны, потому что, когда fout будет уничтожен, файл будет закрыт (и очищен) как часть fstream деструктора.

Во-вторых, вы должны использовать ofstream или альтернативно добавить флаг std::ios::out к параметру openmode.

Попробуйте что-то вроде:

{
  uint64_t x = 42;
  std::fstream of("test.txt", std::ios::app);
  of << x << std::endl;
}
2 голосов
/ 23 февраля 2012

Мне интересно, если вы не используете неправильный класс. Если вы хотите записать в файл, используйте std::ofstream, а не std::fstream. В частности, конструктор std::ofstream вызывает бит ios_base::out при вызове rdbuf()->open; конструктор std::fstream этого не делает (поэтому вы открываете файл без прав на чтение и запись).

И вы, вероятно, хотите проверить состояние ошибки: открылось ли успешно, а после закрытия (или сброса) все записи были успешными. Обычный способ сделать это просто:

if ( fout ) {
    //  All OK...
}

if ( !fout ) {
    //  Something went wrong.
}

После открытия (конструктор) вы можете использовать fout.is_open(), преимущество которого в том, что вы немного более явны в отношении того, что вы проверяете.

...