2017-05-17 61 views
0

我正在寫一段代碼,其中一部分正在讀取文件中的「記錄」到n長度的數組,n作爲參數給出。文件中的記錄具有恆定的長度(在本例中爲1024),並且只包含數字,空格和小寫字母。每個記錄都以\ n結尾。我用以下結構,以保持一個記錄:使用fread從文件讀取數據結構

typedef struct{ 
char rec[1024]; 
} record; 

和代碼用於提取其中的N以及在記錄正長數組存儲是這樣寫的:

record * recs=malloc(n*sizeof(record)); 
size_t read=fread(recs,sizeof(record),(size_t)n,f); 

當我檢查輸出這個操作的結果是數組recs的第一個元素包含了所有的記錄,第二個元素除了第一個之外都是這樣,而不是在數組的每個元素處保留一個。我有點失落,因爲我認爲它應該將每條記錄存儲在不同的數組元素中。 至於建議,我也打開陣列的文件和打印元素提供代碼:

if((f=fopen(argv[2],"r"))==NULL){ 
     perror("error opening file\n"); 
     exit(1); 
    } 

for(int i=0;i<(int)read;i++){ 
     printf("record number %d\n %s\n",i,recs[i].rec); 
    } 
+0

請表明寫出記錄的代碼,也是'fopen's該文件的代碼。 – dasblinkenlight

+0

@dasblinkenlight我按照你的建議編輯了我的問題。 –

+1

將''r「'改爲'」rb「'看看是否有幫助。 – dasblinkenlight

回答

6

的問題是,你的記錄rec不是零結尾的字符串。

因此使用%s進行打印會顯示所有記錄,因爲打印只會持續到打印'\0'

因此,要麼確保在每個rec中添加零終端,要麼使用另一種打印方式,而不是%s

順便說一句:如果recs內部沒有任何零終端,您實際上有未定義的行爲。

這個小程序模仿了問題:

#include <stdio.h> 

struct r { 
    char c[1]; 
}; 

int main(void) { 
    int i; 
    struct r recs[4] = {{'a'}, {'b'}, {'c'}, {'\0'}}; 
             //  ^^^^^ 
             //  Just to stop printing here 
    for (i=0; i<3; i++) 
    { 
     printf("%d %s\n", i, recs[i].c); 
    } 

    return 0; 
} 

輸出:

0 abc 
1 bc 
2 c 
+0

這就是可能是這種情況,非常感謝你的幫助。我幾個小時後都不會自己找到它。 –