2014-03-31 36 views
0

我有以下程序:C程序不斷關閉

#include <stdio.h> 
#include <conio.h> 

main(char name[31], int phone) 
{ 
    FILE *file; 
    file=fopen("data.txt","w"); 

    if (file==NULL) 
    { 
     file=fopen("data.txt","w"); 
     printf("Name : "); 
     scanf("%s",&name); 
     printf("\nPhone number : "); 
     scanf("%d",&phone); 
     printf("Your booking number is : "); 
     fprintf(file,"%s;%d\n",name,phone); 
     fclose(file); 
    } 
    else 
    { 
     file=fopen("data.txt","a"); 
     printf("Name : "); 
     scanf("%s",&name); 
     printf("\nPhone number : "); 
     scanf("%d",&phone); 
     fprintf(file,"%s;%d\n",name,phone); 
     fclose(file); 
    } 
} 

當我編譯並運行程序,程序要求的名稱。輸入名稱後,會出現警報並關閉程序。該程序曾經工作,但重新啓動計算機後,它現在有這種新的行爲。

什麼可能是錯誤的?

+0

通常我會說你需要詳細說明確切的錯誤信息是什麼,但現在我只是想知道你認爲你是通過什麼傳遞給主要的,以及應該如何工作....無論你是什麼做...不要這樣做。只需在函數中聲明一個本地int和數組,以存儲從用戶讀取的值 – Mike

+0

我同意Mike。這不是一個標準的C程序。 – avgvstvs

+0

我認爲這是我第一次看到有人使用局部變量的函數參數列表... – hyde

回答

4

這個程序有一些相當嚴重的問題。

最小的第一個 - 請修正您的格式。你讓自己更難注意到錯誤。如果您無法讀取您的代碼,則無法對其進行調試。

下一個就是你main函數聲明:

main(char name[31], int phone) 

這不是你如何定義main。它的定義必須是這樣的:

int main() 
{ 
    //code here 
} 

我對定義甚至編譯有些吃驚。

您可能想要做的只是將namephone作爲main中的正常變量聲明,就像您聲明的file一樣。

編輯:如在評論中指出由@Namfuak,main可以採取的另一種形式:

int main(int argc, char** argv) 
{ 
    //code here 
} 

在這種形式中,argc持有在命令行傳遞的參數的數目的程序,並且argv自己保存這些參數。但是,您不需要此表單,因爲您從stdin獲取用戶輸入。只需參數更少的int main()版本就足以滿足您的需求。

移動到您的文件訪問......

file=fopen("data.txt","w"); 

if (file==NULL) 
{ 
    file=fopen("data.txt","w"); 

你試圖打開該文件,如果它不會打開您再次打開它?請不要這樣做。這不是一個好主意;如果文件不會打開一次,再次嘗試不會爲您做任何特別的事情。

同樣,

else 
{ 
    file=fopen("data.txt","a"); 

這實在不是一個好主意,無論是。如果file不爲空,則表示您設法成功打開文件。你爲什麼試圖在不關閉的情況下重新打開它?

對我來說,你想要做的就是檢測文件是否存在,如果存在則附加到它,或者創建&如果不存在,請打開它。您只需要使用「a」標誌,但是,按照fopen docs(強調我的):

append:在文件末尾打開輸出文件。輸出操作始終在文件末尾寫入數據,並將其展開。重新定位操作(fseek,fsetpos,倒帶)將被忽略。如果該文件不存在,則創建該文件。

所以,如果你只需要打開該文件中追加("a")模式,並確保file不爲空,你可以安全地寫入。要麼它不存在,所以你會創建它,或者它會存在,你會打開它。

+0

+1爲一個相當不明確的問題提供了一個很好的答案。 – Alex

+0

小抱怨 - 'main'也可以定義'main(int argc,char ** argv)'(或'char * argv []'),這就是爲什麼他的編譯器可能允許它。我在g ++上測試過它,它編譯了,雖然它警告無效的主要參數,但由於他的錯誤順序,它似乎在'char *'和'char **' 'int',這意味着如果你嘗試使用它們,它們會發生段錯誤。 – IllusiveBrian

+1

@Namfuak感謝批評。我會編輯我的帖子,提到'main'的替代定義,儘管我認爲op可以更好地堅持簡單的無參數版本,直到他們更熟悉該語言。 – computerfreaker