2011-09-05 5 views
1

일부 사용자 입력을 캡처하여 구조 및 파일에 저장합니다.scanf가 실행 순서를 변경하는 이유는 무엇입니까?

각 필드에 대해 먼저 printf을 사용하여 프롬프트를 작성한 다음 scanf을 사용하여 구조체에 데이터를 캡처하고 마지막으로 fprintf을 사용하여 파일에 씁니다.

프로그램은 제대로 작동하지만 하나의 컴퓨터에서만 하나의 scanf이 해당 printf 앞에 실행됩니다.

는 여기에 문제의 핵심입니다 :

printf("\n color: "); 
scanf("%s",&robot1.color); 
fputs(robot1.color, f); 
fputs("\n",f); 

printf("\n energy: "); 
scanf("%d",&robot1.energy); 
fprintf(f,"%d",robot1.energy); 
fputs("\n",f); 

printf("\n height: "); 
scanf("%f",&robot1.height); 
fprintf(f,"%.2f",robot1.height); 
fputs("\n",f); 

printf("\n weight: "); 
scanf("%f",&robot1.weight); 
fprintf(f,"%.2f",robot1.weight); 
fputs("\n",f); 

내가 Dev-C++를 사용하여 두 개의 윈도우 PC에서 그것을 테스트하고 맥 사용하여 GCC에. Windows 시스템 중 하나가이 모든 혼란을 일으키는 시스템입니다.

정확한 실행 (사용자 입력을 포함)이다

color: red 
energy: 100 
height: 30.5 
weight: 500.0 

그러나 번잡 컴퓨터

, I 입력 에너지 값 후, 아무것도 표시하지 않고, I는 입력 높이 값이 계속. 그 후 , 나는 무게를 캡처하여 높이와 무게 프롬프트 마무리 참조 : 파일이 너무 모든 경우에 올바르게 기록

color: red 
energy: 100 
30.5 
height: 
weight: 500.0 

을, 왜 scanfprintf 만 하나의 컴퓨터 데 문제가 무엇입니까?

구조체의 정의는 다음과 같습니다 나는 사용자가 입력하라는 메시지가 표시되고 전에 stdout 플러시되지와의 문제를 추측하고

typedef struct roboto 
{ 
    char name[10]; 
    char color[10]; 
    int energy; 
    float height; 
    float weight; 
}robot; 

답변

3

. 이 문제를 해결하려면 fflush(stdout);을 사용하여 각 인쇄문 다음에 stdout을 플러시 할 수 있습니다. 예를 들면 다음과 같습니다.

printf("\n color: "); 
fflush(stdout); 
scanf("%s",&robot1.color); 
fputs(robot1.color, f); 
fputs("\n",f); 
+0

다른 제안 사항이 있습니까? 왜 이것이 단지 1 대의 컴퓨터에서 발생하는지에 대한 아이디어가 있습니까? – ghopper3

+1

해당 컴퓨터에서 다른 컴파일러 또는 OS를 사용하고 있습니까? – GWW

2

표준 출력은 버퍼링되므로 작성시기를 알 수 없습니다. 을 호출 한 후 출력을 쓰려면 fflush(stdout)으로 전화를 걸면 출력이 기록되는지 확인할 수 있습니다.

+0

감사하지만, 다른 대답에 명시된 바와 같이, 이것은 다른 아이디어를 가지고 있지 않습니까? – ghopper3

+0

코드가 작동하지 않는 이유를 모르겠습니다. 나는'write' 나'_write' 시스템 호출을 사용하여'printf' 대신 직접 파일 기술자 1 (stdout)에 메시지를 쓰는 것이 좋습니다. –

0

아마도 scanf에서 반환 값을 확인하면 몇 가지 단서가 있습니다. 그 값을 무시하는 것은 단지 문제를 묻는 것입니다.

관련 문제