用结构体读取文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
struct data
{
char id[20];
char name[20];
char sex[10];
int old;
char number[20];
char habit[10];
char b[10];
int piao;
} student[10];
FILE *fp;
if((fp=fopen("shiyan.txt","r"))==NULL)
{
printf("File cannnot be open!");
exit(1);
}
int i=1;
char line[10][100];
while(!feof(fp))
{
fgets(line[i],100,fp);
if(strlen(line[i])>10)//有些行只含一个回车 当然不能作为一个结构体读取
{

sscanf(line[i],"%s %s %s %d %s %s %s %d ",student[i].id,
student[i].name,
student[i].sex,
&student[i].old,
student[i].number,
student[i].habit,
student[i].b,
&student[i].piao);
i++;
}
}
fclose(fp);

int n;

printf("投票选手:");
scanf("%d",&n);
student[n].piao++;

if((fp=fopen("shiyan.txt","w"))==NULL)
{
printf("File cannot be open!");
exit(1);
}
printf("i=%d",i);
for(int j=1;j<i;j++)
{
fprintf(fp,"%s %s %s %d %s %s %s %d ",student[j].id,
student[j].name,
student[j].sex,
student[j].old,
student[j].number,
student[j].habit,
student[j].b,
student[j].piao
);
}

fclose(fp);
return 0;
}

//文件shiyan.txy 

//文件内容

id:1 朱逸文 男 20 201408091097 电脑 票数: 0
id:2 徐晓红 女 45 65643 烧饭 票数: 0
id:3 朱长才 男 50 66441231213 看书 票数: 0

//输入内容:2

//文件修改后的内容

id:1 朱逸文 男 20 201408091097 电脑 票数: 0
id:2 徐晓红 女 45 65643 烧饭 票数: 1
id:3 朱长才 男 50 66441231213 看书 票数: 0

总结:这是一个对文件部分内容进行修改的一个程序 而这种修改的思路

1:读取文件所有内容(需要修改和不需要修改的)到结构体中

2:用各种方法在结构体中定位需要修改的内容 

3:在结构体中修改这部分内容

4:把修改后的结构体全部写入文件中

在这其中遇到的问题:

1:读取文件内容到结构体中 刚开始想的很单纯 用一个循环 while(!feof(fp)) 一个结构体一个结构体读 后面证明 这种方法有缺陷! 因为文件内容是其实我用另一个程序写进文件中的 其有固定的格式 值得注意的一点格式就是 每一行数据后面都有一个回车(这样可以使数据更直观)。但面对这种格式 用以上的读取就会出现问题 即:当读完

id:3 朱长才 男 50 66441231213 看书 票数: 1的时候。 其实 还没有到文件末尾 所有会再读取一个结构体 而这个结构体的内容只有一个回车 导致最后这个结构体内部的内容变成乱码。 后用fgets(line[i],100,fp);
                  if(strlen(line[i])>10);解决

这里引入一个Line的媒介,使那些只含回车 空格的一些无用内容就直接不读如结构中了 这样就避免的上面的问题。

原文地址:https://www.cnblogs.com/aloney/p/4732069.html