#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\n",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\n",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的媒介,使那些只含回车 空格的一些无用内容就直接不读如结构中了 这样就避免的上面的问题。