2015-06-12 41 views
0

爲什麼這段代碼讀取文件中的最後一個東西兩次?誰能幫我 ?? feof和循環有什麼問題? 爲什麼它總是不正確,我試了太多次?該回路有什麼問題?

在此先感謝

char n [120]; 
char p[120]; 
char e [120]; 
char g [120]; 
int no; 
FILE *fptr; 
fptr=fopen("answer.txt","ra+"); 
if(fptr==NULL) 
{ 
    printf("Error!"); 
    exit(1); 
} 


    printf("%6s %-20s %-15s %-15s %-15s\n","Acct#","Name","Phone","Email","Group" ); 
    printf("------ -------------------- ------------- ------------------- --------------- \n"); 

    currentc=firstc; 

    while(!feof(fptr)) 
    { 
      currentc= (struct contact *) malloc(sizeof(struct contact)); 
      fscanf(fptr,"%d",&no); 
      currentc->number=no; 
      printf("%6d: ",currentc->number); 
      fscanf(fptr,"%s",&n); 
      strcpy(currentc->name,n); 
      printf("%-20s ",currentc->name); 
      fscanf(fptr,"%s",&p); 
      strcpy(currentc->phone,p); 
      printf("%-15s ",currentc->phone); 
      fscanf(fptr,"%s",&e); 
      strcpy(currentc->email,e); 
      printf("%-20s ",currentc->email); 
      fscanf(fptr,"%s",&g); 
      strcpy(currentc->group,g); 
      printf("%-15s ",currentc->group); 



    } 



fclose(fptr); 
} 
+7

閱讀[爲​​什麼是「while(!feof(file))」總是出錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)知道爲什麼。掃描'%s'時,不要在變量名前加'&'。並使用''r「'(read)或''r +」'(讀寫)作爲'fopen'的第二個參數。此外,[不要將'malloc'和family的結果在C中進行轉換](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

+0

和format/indent你的代碼更好,它會幫助你 – Eregrith

回答

0

的原因是,你正在閱讀的,而塊多行,但是每次檢查多行FEOF一次。問題是最後一個空行,它會嘗試讀取另一組值。但是由於它們是空的,以前的值正在打印。

簡單的答案是打印前讀取一次,並重新檢查:

while(!feof(fptr)) 
{ 
    fscanf(fptr,"%d", &no); 
    fscanf(fptr,"%s", &n); 
    fscanf(fptr,"%s", &p); 
    fscanf(fptr,"%s",&e); 
    fscanf(fptr,"%s",&g); 

    if(!feof(fptr)){ 
     printf("%6d: ", no); 
     printf("%-20s ", n); 
     printf("%-15s ", p); 
     printf("%-20s ", e); 
     printf("%-15s \n", g); 
    } 
} 
1

更改時的狀態。而不是檢查!feof(file),檢查fscanf是否成功(即,fscanf()== 1)。如果成功則fscanf返回1,否則返回0。

被調用的最後一個fscanf讀取文件的最後一行,之後檢查while循環條件!feof(file)。這將是真實的,因爲文件的末尾沒有達到。所以循環再執行一次。