Допустим, у меня есть где-то в моей программе функция, которая открывает файл с
fopen
, а затем моя программа делает что-то еще (скажем, пытается что-то вычислить), а затем она падает из-за какого-то нулевого указателя, или переполнения стека, или ошибки сегментации и т. д. , Есть ли шанс, что это уничтожит/испортит файл, который я открыл?Что, если бы я открыл его для записи. Будет ли тогда это еще опаснее?
Может ли fopen или fstream и т. д. случайно уничтожить файл C/C++
Ответы (1)
Если вы откроете файл для чтения, а затем нет, вы не сможете повредить файл.
Если вы откроете файл для записи, а затем да, всегда можно оставить файл в поврежденном состоянии.
person
Dúthomhas
schedule
30.09.2017
Я думаю, что я мог очень сильно зависеть от ОС. Но да, здравый смысл говорит, что ваш ответ правильный.
- person bolov; 30.09.2017
Э-э, любая ОС/ФС, которая делает ваши данные уязвимыми, просто читая их, непригодна для использования. Это не просто здравый смысл, это необходимая функциональность.
- person Dúthomhas; 30.09.2017
По крайней мере, на некоторых платформах и типах файловых систем при чтении файла будут обновляться некоторые метаданные, связанные с файлом, в частности, информация о метках времени. Таким образом, чтение фактически включает в себя запись в какую-то часть файловой системы. Насколько мне известно, в файловых системах Linux рассматриваемая область метаданных имеет фиксированный размер, и я не думаю, что неудачная запись может привести к повреждению файла или каталога. Во всяком случае, я никогда этого не видел. Но я не думаю, что можно с уверенностью предположить, что при любых обстоятельствах невозможно, чтобы сбой во время чтения оставил файловую систему неудовлетворительной.
- person Kevin Boone; 30.09.2017
Это правда, но сохранение атомарности — это задача ОС, а не вашей программы. Некоторые FS лучше спроектированы для восстановления после таких вещей, как «пользователь выключает компьютер вместо завершения работы»; В частности, FAT FS уязвимы для поврежденных секторов, когда это делает пользователь. Однако это совершенно другая проблема, чем сбой пользовательской программы...
- person Dúthomhas; 01.10.2017
Спасибо за подробное и довольно понятное обсуждение, ребята.
- person Niteraleph; 01.10.2017
ifstream
, а в C нет. В C++ есть операторы извлечения потока, которые можно перегрузить для чтения в экземплярах пользовательских классов. - person Thomas Matthews   schedule 30.09.2017FILENAME.tmp
), напишите в него, а затем переименуйте его в исходное имя файла, только если запись прошла успешно. - person myaut   schedule 30.09.2017