2013-09-28 4 views
4

Я прочитал все источники, и я попытался понять, почему этот код дает такой вывод, но я не мог понять. Пожалуйста, если кто-то может дать мне конкретные ответы ....два последовательных файла в одном файле

#include<stdio.h> 

int main() 
{ 
    FILE *fp1; 
    FILE *fp2; 

    fp1=fopen("abc","w"); 
    fp2=fopen("abc","w"); 

    fwrite("BASIC",1,5,fp1); 
    fwrite("BBBBB CONCEPTS",1,14,fp2); 

    return 0; 
} 

Выход ОСНОВНЫЕ ПОНЯТИЯ, когда я открыл файл «ABC». Почему второй файл не перезаписал содержимое файла «abc»? ожидаемый результат должен быть BBBBB КОНЦЕПЦИИ

+2

Попробуйте добавить к коду различные комбинации (недостающие вызовы) 'fclose()' и посмотреть, что произойдет. – alk

+0

Какой компилятор вы используете? MSVC генерирует ожидаемый результат. – simonc

ответ

3

Проблема заключается в том, что вы используете буферизованный fwrite() вместо небуферизованном write(). Позднее говорит ядру: «напишите этот материал в файл сейчас», первый сообщает, что стандартная библиотека C «записывает этот материал в файл всякий раз, когда вы сочтете нужным». Очевидно, что эта стандартная реализация библиотеки C сначала очистила материал от fp2, а затем переписала его с помощью материала от fp1.

Конечно, вы можете обеспечить правильную последовательность промывки, вызвав непосредственно fflush() и/или фактически закрыть ваши файлы.

+0

Более интересный вопрос для меня - почему именно этот порядок используется при очистке содержимого. –

+0

@GearoidMurphy Этот конкретный заказ будет зависеть от реализации, афайк не имеет абсолютно никаких гарантий на этом в стандарте C. Это, по сути, сводится к вопросу о том, работает ли цикл в коде очистки спереди или сзади, и это полностью зависит от программиста ... – cmaster

+0

@cmaster: Спасибо, я понял сейчас .. –

1

Как указано в cmaster, fopen создает буферный поток файлов. Буферизованные потоки будут только очищать свои данные, когда им явно говорят сделать это через fflush или когда буфер заполнен, как правило, около 4096 байт. Небольшие объемы данных, которые вы написали в буферизованные потоки, не приведут к сбросу данных на диск.

Если программа terminates, когда открыты буферизованные потоки, libc (который реализует буферный поток) automatically сбрасывает потоки, начиная с самого недавно открытого потока, в GNU LibC в любом случае. Как правильно указывает cmaster, порядок, в котором файлы закрыты, не указан стандартом C, только они закрываются. must.

+0

спасибо информация хороший. –

Смежные вопросы