2015-10-23 6 views
0

У меня есть часть кода для компилятора для базовой арифметики (add, diff). В моем файле mparse.y yacc я прочитал ввод из файла в основной функции. Чтобы вызвать синтаксический, я поставил условие следующим образом:using yyparse() и fprintf

if(yyparse()==0) 
    fprintf(stderr,"Parsing complete."); 

последнее утверждение yyparse, после завершения должно быть:

printf("The last statement of yyparse"); 

Проблема заключается в том, если я использую fprintf() , я получаю следующую абсурдную вывод:

Parsing Complete 
The last statement of yyparse. 

Принимая во внимание, если я использую Printf вместо fprintf, я получаю нормальный выход.

The last statement of yyparse 
Parsing complete. 

второй вариант не должен быть правильным, то есть, все утверждения yyparse должны выполняться первым, а затем Printf после если? Почему это странное поведение?

ответ

1

Это результат того, что stderr и stdout буферизованы по-разному. Это не имеет никакого отношения к yyparse.

Stdout обычно является строковым буфером, что означает, что вывод хранится в буфере до тех пор, пока не будет напечатана новая строка или дескриптор файла не будет закрыт.

Stdout обычно не буферизирован, поэтому его выход является немедленным.

Если вы смешиваете выходной сигнал с выводом stdout и stderr, порядок фактического выхода может быть инвертирован.

Кстати, если вы хотите вывести фиксированную строку, лучше использовать puts(msg) (для печати на стандартный вывод) или fputs(msg, file). puts автоматически выводит строку новой строки в конце строки; если по какой-то причине вы этого не хотите, используйте fputs(msg, stdout)

+0

@ HarshS.Kulshrestha И stderr предназначен для ошибок. Все вы упомянутые вы должны перейти на stdout. – EJP

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