在c中打开/读取文本文件

时间:2013-03-20 01:28:29

标签: c file struct fread

您好我在linux上使用gcc -Wall -std = c99和a./out运行此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;

}

任何帮助将非常感谢!谢谢lott

1 个答案:

答案 0 :(得分: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