C语言文件读入的问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 19:52:21
数据为data.txt
1 B04041232 韩潇潇 B050311 0 0 0 旷考
2 B04041331 董安文 B050311 80 0 56 63
3 B04041418 孙 勇 B050311 70 0 14 31
4 B04041420 成 祥 B050311 90 0 59 68
5 B05031101 刘玲玲 B050311 95 0 84 87
6 B05031102 骆小芳 B050311 98 0 94 95
……
我想将其读入一个机构体中:
struct student
{
int num;
char code[10];
char name[20];
char grade[10];
double regular;
double middle;
double final;
char total1[10];
};

……
if((fp=fopen("data.txt","r"))==NULL)
{
printf("Cannot open the file\n");
exit(0);
}
for(i=0;i<g;i++)
{
stu[i].total = 0;
strcpy(stu[i].total1,"0");
}
for(i=0;i<g;i++)
{
fscanf(fp, "%d %s %s %s %lf %lf %lf %s\n",&stu[i].num,stu[i].code,stu[i].name,stu[i].grade,&stu[i].regular,&stu[i].middle,&stu[i].final,stu[i].total1);
fgetc(fp)
}
……

用gets(),scanf不能接受空格、制表符Tab、回车等,而gets能够接受空格、制表符Tab和回车等。
由于你的第3列数据固定是名字(char)类型,因此,如果你scanf用的熟练,而且喜欢的话,你可以头两个数据和第4个以后的数据可以用scanf读取。但是第3个数据是可能有空格的,因此用gets()单独处理第3个数据。
思路就是这样的,不管你用什么方法,建议单独处理第3个数据,毕竟scanf对于其他格式化的数据读取还是稍微有些优势的,那就分开处理吧。

对读入的数据进行判断,如果有空格则跳过该字符
直到不是空格为止

char a;
while(fread(&a, sizeof(char), 1, fp) )
{
if(!isspace(a))
..........
else
continue
}

这个需要做特殊处理,读姓名的时候要一个字符一个字符的读入,直到下一个字符是字母。如果你写数据的时候,把空格替换成下划线或者其他符号,就好弄一些。用二进制读写更简单。

这个需要做特殊处理,读姓名的时候要一个字符一个字符的读入,直到下一个字符是字母。如果你写数据的时候,把空格替换成下划线或者其他符号,就好弄一些

char a;
while(fread(&a, sizeof(char), 1, fp) )
{
if(!isspace(a))
..........
else
continue
}
用gets(),scanf不能接受空格、制表符Tab、回车等,而gets能够接受空格、制表符Tab和回车等。
由于你的第3列数据固定是名字(char)类型,因此,如果你scanf用的熟练,而且喜欢的话,你可以头两个数据和第4个以后的数据可以用scanf读取。但是第3个数据是可能有空格的,因此用gets()单独处理第3个数据。
思路就是这样的,不管你用什么方法,建议单独处理第3个数据,毕竟scanf对于其他格式化的数据读取还是稍微有些优势的,那就分开处理吧。