2013-07-09 29 views
0

我使用C語言編程,我試圖讀取每一行的第一個字符串中的二進制文件。從二進制文件中讀取不成功用C

二進制文件數據的實例(我已經寫了一個txt文件,以顯示你)

Iliya Iliya Vaitzman 16.00以色列1 0 1

我想讀第一個伊利亞在該行(或者該行的第一個詞將是什麼)。

我想下面的代碼,但它一直返回NULL的字符串變量我給他

下面的代碼:

FILE* ptrMyFile; 
    char usernameRecieved[31]; 
    boolean isExist = FALSE; 
    ptrMyFile = fopen(USERS_CRED_FILENAME, "a+b"); 
    if (ptrMyFile) 
    { 
     while (!feof(ptrMyFile) && !isExist) 
     { 
      fread(usernameRecieved, 1, 1, ptrMyFile); 
      if (!strcmp(userName, usernameRecieved)) 
      { 
       isExist = TRUE; 
      } 
     } 
    } 
    else 
    { 
     printf("An error has encountered, Please try again\n"); 
    } 
    return isExist; 

我用的typedef和#定義一個布爾變量(0假的,一切是真(TRUE是真的,假的就是假))

usernameRecieved保持從FREAD越來越NULL。

我應該怎麼才能解決這個問題呢?

+0

你知道,你只是在FREAD讀取一個字節()? –

+0

二進制文件的格式是什麼?你不能只用'freed()'從一個二進制文件中讀取一個C字符串,除非'\ 0'終止,並且你知道確切的位置和長度。 'userName'沒有被定義。 –

+0

您的文件讀取邏輯錯誤。只有當_already嘗試讀取file_結尾時,'feof()'函數才返回非零值。這意味着,在成功讀取文件中的最後一條記錄後,'feof()'返回false,然後執行另一個'fread()'並繼續使用結果。 FREAD的'的返回值()'爲已讀取對象的數量,所以正確的做法是要始終測試FREAD()'的'的返回值,如果該值是零或其他「錯誤」,_then_你檢查'feof()'並決定是否退出循環。 (另請參閱'ferror()'。) –

回答

0

取而代之的是:

fread(usernameRecieved, 1, 1, ptrMyFile); 

試試這個:

memset(usernameRecieved, 0, sizeof(usernameRecieved)); 
fread(usernameRecieved, sizeof(usernameRecieved)-1, 1, ptrMyFile); 

正因爲如此,你頂多從文件讀取只有一個字節。

+0

我仍然收到相同的 [img] http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg [/ img] –

+0

該文件是否真的包含數據並存在? – Devolus

+0

謝謝,這工作! –

0

Documentation on fread

有兩件事情:你在FREAD計數字段設置爲1,所以你只讀過1個字節,最多(假設你不打一個EOF或其他終端標記)。 這可能是你想要的是:

fread(usernameRecieved, 1, 31, ptrMyFile); 

這樣,你會複製到你的整個字符緩衝區。然後,您只需比較您使用的任何分隔符(空格,句號等)。

目前還不清楚是什麼「usernameRecieved狀態越來越空」的意思; usernameRecieved在堆棧中(您沒有使用malloc)。你的意思是什麼都沒有被讀取?我強烈建議你經常檢查fread的返回值,看看有多少讀取;這對調試很有幫助。

+0

不過,我收到相同的。 http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg –

+0

這不是空,這是一大堆'M's ...你的輸入文件是否有一堆女士/是否良好形成和存在? – akroy