2012-11-04 51 views
0

代碼:沒有什麼是越來越寫入文件

struct subscriber 
{ 
char phonenumber[20]; 
char name[50]; 
float amount; 
}s; 

void addrecords() 
{ 
    FILE *f; 
    char test; 
    f=fopen("file.txt","ab+"); 
    //if(f==0) 
    //{ f=fopen("file.txt","wb+"); 
    //system("clear"); 
    //printf("please wait while we configure your computer"); 
    //printf("/npress any key to continue"); 
    //getchar(); 
    //getch(); 
    //} 

    while(1) 
    { 
    //system("clear"); 
    printf("\n Enter phone number:"); 
    scanf("%s",s.phonenumber); 
    printf("\n Enter name:"); 
    fflush(stdin); 
    //scanf("%[^\n]",s.name); 

    scanf("%s",s.name); 
    printf("\n Enter amount:"); 
    scanf("%f",&s.amount); 
    printf("check 1"); 
    fwrite(&s,sizeof(s),1,f); 
    fflush(stdin); 
    printf("check 2"); 
    //system("clear"); 
    printf("1 record successfully added"); 
    printf("\n Press esc key to exit, any other key to add other record:"); 
    test=getchar(); 
    //test=getche(); 
    if(test==27) 
     break; 
    } 
    fclose(f); 
} 

我這裏面臨兩個問題:

  1. 沒有什麼是越來越寫入文件,雖然被創建的文件。
  2. 輸入數量後,它輸出所有打印語句,並轉到while循環的初始位置,即不等待getchar。
+0

do,'fflush(f)' –

回答

0

fflush從來沒有必要,如果你有fclose

但在你的情況下,你有while(1)fclose以外,這意味着fclose永遠不會被調用,因此文件內容永遠不會被fclose函數更新。

您可能希望在循環中使用fflush,例如,在fwrite之後,它會將緩衝區刷新到實際文件。

1

最後一個scanf()不會在輸入結尾讀取換行符,這就是爲什麼getchar()會立即返回並且不會等待,這也是第一個問題的原因,爲什麼文件沒有寫入,因爲您必須終止程序退出並且文件不被刷新。所以你需要在最後輸入的結束消耗換行符字符,你可以做到這一點與scanf()

scanf("%f%*[^\n]%*c",&s.amount); 

或者用fgets()讀取整個行,使用上scanf()。最後,請注意,你不應該使用fflush()來清除輸入流,它是不確定的:

7.19.5.2.2如果流點到輸出流或其中最近的操作不是輸入的更新流,fflush函數 會導致該流的任何未寫入數據被傳遞到要寫入該文件的主機環境 ;否則,行爲是未定義的 。

+1

在'scanf'格式字符串末尾添加空格通常不是最好的想法。格式'「%f \ n」'在'float'中掃描,然後消耗所有的空白,所以'scanf'在'float'之後遇到下一個非空白字符之前不會返回。最好用'getchar()'循環清除輸入緩衝區。 –

+0

@DanielFischer感謝您指出這一點,我個人使用fgets,但我不想在OP使用它的時候更改scanf,所以我修改了格式。 – iabdalkader

+0

嘿,這是'fgets'的缺點。你忘記了'scanf'的陷阱。噢,你需要'%* [^ \ n]'來壓制分配到新行的東西。 –

0

您已經命名自己的文件file.txt的,所以我假設你想讓你的文件是一個文本文件?但是你用b標誌打開它,它表示二進制格式,並且你使用fwrite寫入它,它不會將數據轉換爲文本,而只是將內部格式轉儲到文件中。

如果您在某種二進制編輯器中查看創建的文件,您會看到它包含數據。