将txt文件中的内容输入到结构体中

一运行就闪退,调试的数据都是乱的,小白也不知道哪里错了,求大神看看
#include
#include
#include
struct bookinf
{
int ID;
char bookname[20];
char writer[20];
char company[20];
int year;
int month;
int price;
} ;
typedef struct bookinf bookinf;
int main()
{
int i,num=0;
FILE *fp;
struct bookinf b[100];
struct bookinf tmpData;
fp = fopen("D:\book.txt", "r"); // 打开文件
char buf[1000];

if (!fp) // 判断是否打开成功
{
perror("读取文件失败");
return;
}
while (fgets(buf, 1000, fp)) // fgets循环读取,直到文件最后,才会返回NULL
num++; // 累计行数
fclose(fp);
fp = fopen("D:\book.txt", "r"); // 打开文件
if(fp==NULL)
{
perror("读取文件失败");
return;
}
memset(b,0X0,sizeof(b));
while (fp)
{
fread(&tmpData,sizeof(struct bookinf),1,fp);
if(ferror(fp))
{
fclose(fp);
perror("读文件失败");

}
if(feof(fp))
{
break;
}
b[i]=tmpData;
i++;
}
fclose(fp);
for(i=0;i<6;i++)
{
printf("序号:%d,书名:%s,作者:%s,出版社:%s,日期:%d年%d月,价格:%d",b[i].ID,b[i].bookname,b[i].writer,b[i].company,b[i].year,b[i].month,b[i].price);
}
return 0;
}

fread(&tmpData,sizeof(struct bookinf),1,fp);
你这个读入完全没有根据啊,你需要一项一项的读入

你的book.txt是文本文件,不能用fread函数,而应该使用fscanf。fread是读取二进制文件的

一个很明显的问题是:你的i没有初始化成0,导致你b[i] = tmpData;可能是从一个未知的地方开始存的
PS:首先你要保证你写入的数据格式是没问题的,才能读出来正确

还是先看看C语言中有关文件的操作吧,程序写的太乱了

闪退的原因是啥?报错是啥。。。segment fault?如果是 就是 楼上说的那个i的问题了

存在两个问题:
1. 闪退可能是读出的行数超过100了,你那个b[100],只能放下100行数据。
2. 如果数据行没有超过的话,那就可能是其中某项的数据大小越界了,你单步跟踪一下就知道了!
3. 那个赋值 b[i]=tmpData; 语句,只是每次把 tmpData的地址赋给了每个b[i],这样即使你最后读完了,也只能得到最后那一个数据。
这里要用拷贝操作才行: memcpy(&b[i],tmpdata,sizeof(struct bookinf)

你的文件得按照结构体的顺序先写进去啊,然后读文件的时候直接按字节数 赋给结构体啊,你存的是结构体,你按行读,每一个变量对应不起来好吗。你代码比我还乱,花式搞自己啊

按字节 来读写,不会错。你又不是一行一行字符串。。。按行读干嘛

程序太乱了 程序员 最不喜欢的就是看到这种程序了
定义 变量在前 写的程序在后 注意空格 同样的if 判断请想好在写
读写文件 一般用fscanf fprintf
fread 一般文件底层用