Может ли fopen или fstream и т. д. случайно уничтожить файл C/C++

  1. Допустим, у меня есть где-то в моей программе функция, которая открывает файл с fopen, а затем моя программа делает что-то еще (скажем, пытается что-то вычислить), а затем она падает из-за какого-то нулевого указателя, или переполнения стека, или ошибки сегментации и т. д. , Есть ли шанс, что это уничтожит/испортит файл, который я открыл?

  2. Что, если бы я открыл его для записи. Будет ли тогда это еще опаснее?


person Niteraleph    schedule 30.09.2017    source источник
comment
Если вы открываете файл для записи, а данный файл существует, его содержимое все равно уничтожается.   -  person Weather Vane    schedule 30.09.2017
comment
Какой язык, С или С++? Это разные языки. В C++ есть ifstream, а в C нет. В C++ есть операторы извлечения потока, которые можно перегрузить для чтения в экземплярах пользовательских классов.   -  person Thomas Matthews    schedule 30.09.2017
comment
Уничтожение содержимого файла при открытии зависит от того, как вы открываете. w и w+ и содержимое исчезло. a, r+ a+ и содержимое все еще там.   -  person user4581301    schedule 30.09.2017
comment
Откройте файл с другим именем (например, FILENAME.tmp), напишите в него, а затем переименуйте его в исходное имя файла, только если запись прошла успешно.   -  person myaut    schedule 30.09.2017
comment
Если бы я использовал fopen для файла_1, затем скопировал содержимое в буфер (некоторая оперативная память моих программ), затем скопировал память в новый файл file_1_copy и закрыл его, а ЗАТЕМ открыл файл_1 для записи, то было бы это полностью безопасно? В том, что даже если моя программа рухнет при копировании файла в файл-копию, ничего не потеряется, а если программа рухнет при записи исходного файла, то копия даст бэкап?   -  person Niteraleph    schedule 30.09.2017
comment
Резервное копирование - хорошая идея. Просто убедитесь, что резервная копия прошла успешно, прежде чем редактировать оригинал. Обычно есть системные функции, которые вы можете использовать вместо самостоятельного копирования файла.   -  person user4581301    schedule 30.09.2017


Ответы (1)


  1. Если вы откроете файл для чтения, а затем нет, вы не сможете повредить файл.

  2. Если вы откроете файл для записи, а затем да, всегда можно оставить файл в поврежденном состоянии.

person Dúthomhas    schedule 30.09.2017
comment
Я думаю, что я мог очень сильно зависеть от ОС. Но да, здравый смысл говорит, что ваш ответ правильный. - person bolov; 30.09.2017
comment
Э-э, любая ОС/ФС, которая делает ваши данные уязвимыми, просто читая их, непригодна для использования. Это не просто здравый смысл, это необходимая функциональность. - person Dúthomhas; 30.09.2017
comment
По крайней мере, на некоторых платформах и типах файловых систем при чтении файла будут обновляться некоторые метаданные, связанные с файлом, в частности, информация о метках времени. Таким образом, чтение фактически включает в себя запись в какую-то часть файловой системы. Насколько мне известно, в файловых системах Linux рассматриваемая область метаданных имеет фиксированный размер, и я не думаю, что неудачная запись может привести к повреждению файла или каталога. Во всяком случае, я никогда этого не видел. Но я не думаю, что можно с уверенностью предположить, что при любых обстоятельствах невозможно, чтобы сбой во время чтения оставил файловую систему неудовлетворительной. - person Kevin Boone; 30.09.2017
comment
Это правда, но сохранение атомарности — это задача ОС, а не вашей программы. Некоторые FS лучше спроектированы для восстановления после таких вещей, как «пользователь выключает компьютер вместо завершения работы»; В частности, FAT FS уязвимы для поврежденных секторов, когда это делает пользователь. Однако это совершенно другая проблема, чем сбой пользовательской программы... - person Dúthomhas; 01.10.2017
comment
Спасибо за подробное и довольно понятное обсуждение, ребята. - person Niteraleph; 01.10.2017