Файл очищен после повторного открытия с помощью std :: fstream - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу открыть файл для чтения, закрыть его, а затем снова открыть его для записи, используя тот же std :: fstream.Но когда я снова открываю файл с правами на запись, все данные внутри очищаются, и он становится длиной 0 байт.Вот мой код:

char* data = new char[5];
std::fstream fs("myFile", std::ios::binary | std::ios::in);//opening with read
fs.read(data, 5);
fs.clear();
fs.close();
//Do some stuff
fs.open("myFile", std::ios::binary | std::ios::out);//opening with write
//The file is already empty at this point

1 Ответ

0 голосов
/ 07 декабря 2018

При открытии файла с установленным по умолчанию флагом write , т. Е. std::ios::out с помощью средства <iostream> или "w" с использованием функций <cstdio>, за ними возникает комбинация флагов POSIXспина - добавлен флаг усечение .Это означает, что при открытии в режиме записи содержимое файла отбрасывается.Чтобы обойти это, откройте файл во второй раз с помощью

fs.open("myFile", std::ios::binary | std::ios::app);

. Режим append перемещает курсор файла в конец файла при каждой операции записи и не объединяется с усекать флаг, см. здесь .Обратите внимание, что если вы хотите записать произвольные позиции в существующем файле, вам нужно открыть его с помощью

fs.open("myFile", std::ios::binary | std::ios::in | std::ios::out);

, который не усекает его содержимое и позволяет позиционировать курсор с помощью функций seek*.

...