-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正在从文件中读取二进制信息,而不是它实际包含的文本。我的意思是它希望在文件中找到结构的内存映像,这取决于您的实现。

因此,例如(尽管这一切都根据您的实现的填充行为和类型大小而有所不同),它可能期望一个单字节char后跟三个填充字节,然后是一个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 回答