2017-05-17 28 views
0

私はコードを書いており、その一部はファイルからn長配列への "レコード"を引数として渡しています。ファイル内のレコードは一定の長さ(この場合は1024)を持ち、数値、スペース、下位文字のみを含みます。各レコードは\ nで終了します。私は1つのレコード保つために、次の構造を使用しています:私は出力をチェックするとフリーダを使ってファイルから構造体へのデータの読み込み

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

:それらのn個を抽出して、レコードの長さnの配列に格納するため

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

とコードをこのように書かれていますこの操作の中で、配列recsの最初の要素には配列の各要素を1つずつ保持するのではなく、すべてのレコードが含まれていることが分かります。私は配列の別の要素に各レコードを格納する必要があると思ったので、一種の失われています。 示唆したように、私はまた、配列のファイルと印刷の要素を開くためのコードを提供しています:

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以外の印刷方法を使用してください。

BTW: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

おそらく、あなたの助けに感謝します。もう数時間は自分でそれを見つけられないでしょう。 –

関連する問題