fwrite() завершился успешно после fclose()
Я столкнулся со странным поведением, которое fwrite()
удается после того, как я закрываю поток fclose()
но файл не перезаписывается как fflush()
выходит из строя.
Мой код:
int main(int argc, char* argv[])
{
FILE* file = fopen("file.txt", "w");
if(!file) perror("Cannot open the file.\n");
char text[] = "1234567";
fclose(file);
int count_of_written_objects = fwrite(text, sizeof(text),1, file);
printf("Count of written objects into the file: %d \n", count_of_written_objects);
if(count_of_written_objects != 1) perror("Not expected count of objects was written.\n");
int success = fflush(file);
printf("Variable success: %d \n", success);
if(success == EOF) perror("Flush did not succeed. \n");
return 0;
}
Это дает следующий вывод:
Count of written objects into the file: 1
Variable success: -1
Flush did not succeed.
: Bad file descriptor
Как может fwrite()
успешно, когда поток закрыт? Можно fwrite()
написать на закрытом потоке? Не могли бы вы объяснить это мне?
1 ответ
Пытаясь выполнить какие-либо операции с файлом после его закрытия, вы имеете дело с неопределенным поведением.
Реализатор библиотеки предполагает, что вызывающая сторона несет ответственность за выполнение вызовов в определенном порядке, поэтому библиотека может или не может попытаться проверить случаи, когда это не так. Проверка в таких случаях игнорируется в основном из-за производительности и уменьшения размера кода.
То же самое произойдет, если вы попытаетесь записать в ячейку памяти, которая была ранее free
"D. Даже если может показаться, что все работает правильно, вы вызываете неопределенное поведение.
Технически говоря, в частном случае не должно быть возможности успешной записи, потому что функция библиотеки fclose
скорее всего, позвонит close
системный вызов базового дескриптора и любой последующий write
системные вызовы этого дескриптора (в конечном итоге вызывается fwrite
) должен потерпеть неудачу, потому что он будет отклонен ядром.