2013-04-17 31 views
2

我正在用C語言編寫程序,並且正在使用fread讀取文本文件,我無法正確讀取整數。在ANSI中讀取fread的整數C

a在文本文件中的值是16,輸出我得到的是:

a= 538976288 

我已經使用了成功讀取二進制文件類似的代碼。我想了解在c中讀取ASCII表的最佳方法是什麼。

表大小由文件頂部的整數給出。數據由空格分隔。

這是一個簡單的代碼,我寫道:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    int a, flag_fread; 
    FILE * p_finput = NULL; 
    char * filename = NULL; 

    filename = malloc(sizeof(char) * (strlen(argv[1]) + 1)); 
    strncpy(filename, argv[1],strlen(argv[1])); 
    filename[strlen(argv[1])] = '\0'; 

    p_finput = fopen(filename, "r"); 
    if (p_finput == NULL) 
    { 
     printf("couldn't open %s \n", filename); 
     abort(); 
    } 


    flag_fread = fread(&(a), sizeof(int), 1, p_finput); 

    printf("a= %d \n", a); 

    fclose(p_finput); 
    free(filename); 
    return 0; 
} 
+0

提示:十進制538976288是十六進制0x20202020;你的代碼從文本文件中讀取4個空格到'int'中。 –

+0

請注意['fread()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fread.html)不用於閱讀'行';它不知道線是什麼,也不應該。如果你需要行,可以使用['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)(或者在POSIX 2008系統上,['getline()']( http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)。這些設計用於讀取具有適當行結尾的行。 –

+0

ok,fgets讀取一個字符串,但是如果我想要獲取該字符串,我應該怎麼做數字在一行? – simona

回答

2

fread文件中讀取數據以其原始的二進制形式。當數據以這種方式存儲時,這是有效的,例如fwrite。處理文本時,您可以使用fscanf,然而建議使用它的用法,因爲它不執行任何可能導致緩衝區溢出的邊界檢查。

更好的做法是使用fgets讀取文件,然後使用sscanf來獲得所需的值。例如:

char buffer[100]; 
int itemsScanned = 0; 
if(fgets(buffer, 100, p_finput) != NULL){ 
    itemsScanned = sscanf(buffer, "%d", &a); 
} 
/* check itemsScanned & continue */ 
+1

這個方法或多或少的工作,但我想要注意的是,手冊說fgets返回緩衝區,或文件結束或錯誤的EOF,而不是bytesRead的數量。如果我將fgets返回的值轉換爲int,那麼我大部分時間都會得到一個負值,如果失敗 – simona

+0

啊,您說的沒錯,我誤解了,謝謝。 – Kninnug

3

讀取寫入文字值,你應該使用fscanf,像這樣:

fscanf(p_finput, "%d", &a);

+0

,因爲實際文件由一個帶整數的行構成,後跟一個帶有三列的表格我使用fread讀取每一行。也讀過fscanf不推薦。 – simona

+0

或者更好,因爲'if(fscanf(p_finput,「%d」,&a)!= 1){... process error ...}。 –

+0

ok,fscanf工作正常但是我必須讀一張桌子,你推薦什麼?爲什麼fread失敗? – simona