-1

こんにちは、gcc -Wall -std=c99 と a./out を使用して Linux でこの C プログラムを実行しています。警告/エラーは表示されません。しかし、ファイルから読み取った情報を印刷すると、クレイジーな出力が得られます。ファイルには次が含まれます。

A13
B99
C2
D2
E44
F32
G2
H9

出力は次のとおりです。

id:  A
size: 171522370
id:  C
size: 876939826
id:  4
size: 843516466

コードは

typedef struct record{

    char id;
    int size;

}record; 


int main ()
{

   record reg;

    FILE *fp = NULL;


    fp = fopen("idSize.txt", "r");


    if ((fp = fopen("idSize.txt", "r")) == NULL){
      printf("error opening file");
      exit(1);
    }

    fread(&reg, sizeof(reg),1,fp);

    while (!feof(fp)){

        printf("id:  %c\n", reg.id);
    printf("size: %d\n", reg.size);


    fread(&reg, sizeof(reg),1,fp);

    }

    fclose(fp);

    return 0;

}

どんな助けでも大歓迎です!どうもありがとう

4

1 に答える 1

3

実際に含まれているテキストではなく、ファイルからバイナリfread情報を読み取っています。つまり、実装に応じて、ファイル内に構造体のメモリ イメージが見つかることを期待しています。

したがって、たとえば (これはすべて、実装のパディング動作と型のサイズによって異なります)、1 バイトのchar後に 3 つのパディング バイトが続き、その後にint.

代わりに使用することを検討する必要がfscanfあります。これはあなたのために変換できます。例として、次のコードを示します。

#include <stdio.h>

typedef struct record {
    char id;
    int size;
} record;

int main (void) {
    record reg;
    FILE *fp;

    if ((fp = fopen ("idSize.txt", "r")) == NULL) {
      printf ("Error opening file\n");
      return 1;
    }

    while (fscanf (fp, "%c%d\n", &(reg.id), &(reg.size)) == 2)
        printf ("id: %c, size: %d\n", reg.id, reg.size);

    fclose(fp);
    return 0;
}

生成:

id: A, size: 13
id: B, size: 99
id: C, size: 2
id: D, size: 2
id: E, size: 44
id: F, size: 32
id: G, size: 2
id: H, size: 9
于 2013-03-20T01:32:05.010 に答える