2012-07-05 3 views
3

Когда я запускаю первый код и сразу нажимаю ctrl-c, в файле не будет 45. Но когда я запускаю второй код, я получаю 45.Буферизация поведения stdout в c

Я не мог прийти к тому, почему это происходит в приведенном ниже коде? Если stdout является строковым буфером, не должен выводиться после ввода символа? Что мне не хватает?

Первый код:

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    fp=fopen("myfile","w"); 
    fprintf(fp,"%d",45); 
    getchar(); 
    // return 0; 

} 

Второй код:

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    fprintf(fp,"%d",45); 
    getchar(); 
    // return 0; 

} 

PS: Я использую GCC и платформы Linux.

ответ

0

Что приводит к путанице является GetChar(), кажется, когда его называют это промывка стандартный вывод.

Если вы замените getchar() чем-то наподобие sleep(10), тогда вы не напечатаете 45.

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    //fp=fopen("myfile","w"); 
    fprintf(fp,"%d",45); 
    sleep(10); 
    //getchar(); 
    // return 0; 

} 
+0

Не обязательно. '45' может быть напечатано или не напечатано. Пожалуйста, см. Мой ответ. –

-4

Первый случай, который вы пишете в физический файл. fopen, fclose - это буферизованный ввод-вывод, зависит от реализации, данные не могут быть переданы немедленно, пока буфер не будет заполнен. Вызов fclose() приведет к тому, что буфер будет записан на диск.

Второй случай, который вы пишете на STDIO, и данные, записанные в STDIO, обычно отображаются немедленно.

+1

-1: данные, записанные в stdout, обычно не отображаются «немедленно», а буферируются по строке, как и другие файлы. –

+0

** STDIO обычно отображается сразу же. ** Это неправильно, stdout является буферизированным по строке. – tuxuday

+0

stdio - это строка буферизации – Aftnix

4

Я не думаю, что getchar имеет какое-либо отношение к буферизации, которую вы наблюдаете в первом коде. Если вы не нажимаете какой-либо символ и не ждете некоторое время (т. Е. Оставайтесь внутри getchar()), вы, скорее всего, увидите пустой файл. Это происходит независимо от того, приостановили ли вы программу с getchar, sleep или while(1).

Теперь вы нажимаете Ctrl-C, для которого ваша программа не имеет зарегистрированного обработчика, и поэтому ваша программа резко прекращается. Будут ли сброшены буферы/потоки на прерывистом завершении программы, определена реализация. Читайте полный рассказ здесь

Why is data not being flushed to file on process exit?

Например, в моей системе (Windows 7, блоки кода, который использует GCC и MinGW рамки внутри), я могу видеть 45 действительно смывания в файл независимо от использования getchar или ничего, когда я прерываю его внезапно. т.е. в моей системе реализация - это сброс данных в файл при внезапном завершении программы.

Итак, в нижней строке указано, что происходит, когда вы делаете что-то ненормальным способом - это реализация определена!

Но второй случай действительно любопытный, где getcharкажется быть промывке stdout буфера.Я уточню, что, как только я нахожу точную причину, почему getchar является/кажется, должен быть промывкой stdout буфер

+0

Спасибо за информацию. Но я хотел знать, почему она ведет себя странно во втором коде, где stdout предполагается быть строковым буфером, но он не вел себя так. – Dhatri

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