2013-10-30 76 views
0

我有一個結構數組,他們被保存到一個文件。目前有兩條線在該文件中:fscanf沒有保存數據結構?

a a 1 
b b 2 

我想在文件中讀取並保存到結構中的數據:

typedef struct book{ 
    char number[11];//10 numbers 
    char first[21]; //20 char first/last name 
    char last[21]; 
} info; 

info info1[500] 
into num = 0; 

pRead = fopen("phone_book.dat", "r"); 

if (pRead == NULL){ 

     printf("\nFile cannot be opened\n"); 
} 
else{ 

     while (!feof(pRead)) { 

      fscanf(pRead, "%s%s%s", info1[num].first, info1[num].last, info1[num].number); 

      printf{"%s%s%s",info1[num].first, info1[num].last, info1[num].number); //this prints statement works fine 

      num++; 
    } 

} 
//if I add a print statement after all that I get windows directory and junk code. 

這讓我覺得,在項目未保存到結構中。任何幫助都會很棒。謝謝!

編輯:好吧,它確實保存它,但是當我將它傳遞給我的函數時,它會給我垃圾代碼。

當我把它叫做:

sho(num, book); 

我的播放功能:

void sho (int nume, info* info2){ 
    printf("\n\n\nfirst after passed= %s\n\n\n", info2[0].first); //i put 0 to see the first entry 
} 
+1

1)什麼是「進」? 2)'printf {'是一個語法錯誤,它不能正常工作。 – Kninnug

+0

你能用文本編輯器打開文件「phone_book.dat」嗎? – SHR

+1

請提供您真正使用的代碼。它不能是你顯示的代碼,因爲這將不會由於各種原因而編譯。 – alk

回答

3
  1. 我認爲你的意思int num = 0;,而不是into

  2. printf{ ...是一個語法錯誤,而是printf( ...。

  3. 查看fscanf的結果,如果不是3,則表示沒有讀取全部3個字符串。

  4. 不要使用(fscanf閱讀串,至少在沒有指定最大長度:

    fscanf(pRead, "%10s%20s%20s", ...); 
    

    但是,更重要的是,使用fgets代替:

    fgets(info1[num].first, sizeof info1[num].first, pRead); 
    fgets(info1[num].last, sizeof info1[num].last, pRead); 
    fgets(info1[num].number, sizeof info1[num].number, pRead); 
    

    (並檢查fgets的結果當然)

  5. 確保num不走高於499,否則你會溢出info

    while(num < 500 && !feof(pRead)){. 
    
+0

它應該是'fscanf(pRead,「%10s%20s%20s」,...',因爲1個字符需要保留爲'0'-終止符 – alk

+0

Trudat,修正了它,謝謝 – Kninnug

+0

@Kninnug I我會添加fscanf(pRead,「%10s%20s%20s」,...);但是爲什麼它會在我的函數中忽略垃圾代碼而不保存數據? – SolidCloudinc

0

1 - 爲了更好的錯誤處理,建議使用fgets(),使用您的sscanf()寬度,驗證sscanf()結果。
2.-OP使用feof(pRead)很容易誤用 - 建議fgets()

char buffer[sizeof(info)*2]; 
while ((n < 500) && (fgets(buffer, sizeof buffer, pRead) != NULL)) { 
    char sentinel; // look for extra trailing non-whitespace. 
    if (sscanf(buffer, "%20s%20s%10s %c", info1[num].first, 
     info1[num].last, info1[num].number, &sentinel) != 3) { 
    // Handle_Error 
    printf("Error <%s>\n",buffer); 
    continue; 
    } 
    printf("%s %s %s\n", info1[num].first, info1[num].last, info1[num].number); 
    num++; 
} 

BTW:使用%s不能很好地工作應在空間中的第一名稱中或姓氏中存在。