关于读文件

zuoyifan100 2011-10-22 10:15:17
如果我想从文件中读数据然后存到结构体的变量中,举个例子:
struct A
{
char name[20];
int age;
double grade;
};
int main ()
{
A record [10]; //就是说有个struct数组
.....
}

但是文件中的数据是这样的:
Zhang, 20, 80
Yu, 23, 78.5
.....

怎么忽略每种数据之间的都逗号和每行的换行符呢?
...全文
65 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小湿哥 2011-10-23
  • 打赏
  • 举报
回复
运行结果。
小湿哥 2011-10-23
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct A
{
char name[20];
int age;
double grade;
};
int main ()
{
A record [10]; //就是说有个struct数组
char k[20],ch = 'a';
int i = 0,j = 0;
FILE *fp;
if((fp=fopen("dat.txt","rt+"))== NULL)//打开文件
{
printf("Can't not open the file!");
return -1;
}
for( j = 0; j != 10; ++j)//建立循环读入数据
{
memset(k,0,sizeof(k));//字符数组k清零,避免“烫烫烫烫烫”的出现
i = 0;
ch =fgetc(fp);//文件指针指向一行开头第一个字符
while(ch != ',')//读取逗号之前的内容,存入k
{
k[i] = ch;
ch =fgetc(fp);
++i;
}
memset(record[j].name,0,sizeof(record[j].name));//字符数组record[j].name清零,避免“烫烫烫烫烫”的出现
strcpy(record[j].name,k);//将k中字符串赋值给record[j].name
while(ch != ' ')ch = fgetc(fp);//使文件指针指向空格
i = 0;
memset(k,0,sizeof(k));
ch =fgetc(fp);//文件指针指向空格后第一个字符
while(ch != ',')//读取逗号之前的内容,存入k
{
k[i] = ch;
ch =fgetc(fp);
++i;
}
record[j].age = atoi(k);//将k中字符串转换为 int型,赋给 record[j].age
while(ch != ' ')ch = fgetc(fp);//使文件指针指向空格
i = 0;
memset(k,0,sizeof(k));
ch =fgetc(fp);//文件指针指向空格后第一个字符
while(ch != '\n')//读取换行之前的内容或结束符之前的内容
{
k[i] = ch;
ch =fgetc(fp);
++i;
if(ch == EOF)break;//如果文件结束,跳出while循环
}
record[j].grade = atof(k);//将k中字符串转换为 浮点型,赋给 record[j].grade
if(ch == EOF)break;//如果文件结束,跳出for循环
}
fclose(fp);//关闭文件
for(i = 0;i<=j ; ++i)//输出结构体数组中内容。
printf("%s %d %.1f \n",record[i].name,record[i].age,record[i].grade);
return 0;

}



文件格式不同可稍作修改。。纯C代码,希望能帮助到LZ。
whuzqc 2011-10-23
  • 打赏
  • 举报
回复
你这是C,还是C++啊?
hzy694358 2011-10-22
  • 打赏
  • 举报
回复
fscanf 如果格式出现偏差就会出问题
或者可以用fgets一行一行读取,再根据 逗号 解析
seucs 2011-10-22
  • 打赏
  • 举报
回复
#define RECORD_SIZE 10

// ...

int ix;
FILE *fp;
struct A record [RECORD_SIZE];

if((fp = fopen("data.txt", "r")) == NULL){
printf("open file error!");
exit(1);
}

for(ix = 0; ix < RECORD_SIZE && !feof(fp); ++ix){
fscanf(fp, "%s%d,%f", record[ix].name, &record[ix].age, &record[ix].grade);
len = strlen(record[ix].name);
record[len - 1] = '\0'; // 去掉逗号
}
shexinwei 2011-10-22
  • 打赏
  • 举报
回复
这个很简单啊。。。。你的数据是有规律的还不好解决。

读姓名

读逗号 //不处理

读年龄

读逗号 //不处理

读成绩

读换行 //不处理

读姓名

。。。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧