Проблемы с файловым потоком c ++ при открытии файла в режиме чтения и записи

Рассмотрим следующий фрагмент кода:

const char * filePath = "C:/blah.mtt";
fstream fs(filePath, ios::in | ios::out | ios::binary);
if (fs.fail())
std::cout << "Failed to open the file!\n";

проверка fs.fail () всегда выполняется успешно. Означает ли это, что я не могу одновременно открыть файл в режиме чтения и записи?

Сначала, создав пустой файл, а затем запустив приведенный выше код, fs.fail () всегда имеет значение false. Что является рациональным для такого поведения класса fstream?

Замечания: У меня есть необходимые разрешения для создания файла. Я пытаюсь это на Windows 10 с использованием VS2015

0

Решение

Означает ли это, что я не могу одновременно открыть файл в режиме чтения и записи?

Нет, вы можете сделать это, но вопрос в том, можете ли вы Создайте файл, делая это.

Как правило, вам нужно добавить trunc флаг (по иронии судьбы, один из вариантов обработки существующего файла) или удаление in флаг (см. Вот).

Да, это немного болезненно, но это связано с тем, как работают оригинальные API POSIX. Винить их!

Сначала, создав пустой файл, а затем запустив приведенный выше код, fs.fail () всегда имеет значение false. Что является рациональным для такого поведения класса fstream?

Вы всегда можете открыть файл, который существует (ну, с учетом разрешений). Такое поведение имеет смысл.

2

Другие решения

проверка fs.fail () всегда выполняется успешно. Означает ли это, что я не могу одновременно открыть файл в режиме чтения и записи?

Обратитесь к @Lightness Races in Orbit’s answer для лучшего объяснения.

Сначала, создав пустой файл, а затем запустив приведенный выше код, fs.fail () всегда имеет значение false. Что является рациональным для такого поведения класса fstream?

Если вы посмотрите на определение конструктора из fstream ты это видишь mode определяет, как вы открываете его. У него есть другие варианты, такие как app добавить в существующий файл. Если вы открываете файл, используя следующий код:

fstream fs(filePath, ios::in | ios::out | ios::binary);

Вы говорите, создайте новый файл, если он не существует. Что не получается, если вы предварительно создали его. Вы должны добавить app, ate или же truncОтметить, если вы хотите, чтобы он успешно открылся. Это зависит от того, что именно вы хотите сделать. Однако обратите внимание, что между этапами создания и последующего открытия он не гарантирует, что файл все еще там. Вы должны попытаться сделать это одним махом, и пусть обработка исключений сделает свое дело, так как вы все равно никогда не сможете обойти ошибки.

0

По вопросам рекламы [email protected]