文件操作
2、假设有文件C:\f11.txt,其中保存着一批学生的3门考试成绩,第一个数据为学号,每位学生一行,格式如下:
001 67.5 86.5 33
002 90 98 66
003 60 69 80
……
编写程序实现功能:
a、 把这个文件的全部数据复制到新文件C:\f11a.txt中去,在C:\f11a.txt中每位学生的3门成绩后面增加一项平均成绩,5项数据之间用制表符或者空格符分隔。
b、 接收用户从键盘输入的学号,查询文件C:\f11a.txt,找到和用户输入学号相同的一行学生信息,并且输出该行学生信息。
这是我编写的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int unsigned id;
float score [3];
float rank;
}Student;
int main ()
{
Student s;
FILE * fp;
fp=fopen("C:\\f11.txt","r+");
if (!fp)
{
printf("file cannot be opened");
exit(1);
}
fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);
//fprintf(stdout,"%g",s.score[2]);
FILE * fw;
fw=fopen("c:\\f11a.txt","wb+");
if (!fw)
{
printf("file cannot be opened");
exit(1);
}
while(!feof(fp))
{
s.rank=(s.score[0]+s.score[1]+s.score[2])/3;
fwrite(&s,sizeof(s),1,fw);
fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);
}
fclose (fp);
fclose(fw);
return 0;
}
重新打开f11a.txt文件并不是所要的类型,求大神帮我修改完成!
我真想杀了二楼,学号的我改了,不过转成char总行吧,路又不是死的。。。说那么多废话。。
1 å¨ä»£ç ä¸å¼ç¨stdio.hï¼å³
#include <stdio.h>
Cè¯è¨çæææ件æä½æ¥å£ï¼å声æå¨è¿ä¸ªå¤´æ件ä¸ã
2 å®ä¹FILE *ç±»åçåéã
3 æå¼æ件ï¼ä½¿ç¨å½æ°ä¸ºfopenãæ ¼å¼ä¸ºï¼
FILE *fopen(char *filename, char *mode);
åæ°filename为è¦åå ¥çæ件åï¼mode为æå¼çæ¹å¼ï¼å¦æä» éåå ¥æ件ï¼å¯ä»¥ä½¿ç¨"w"æ
"wb"ã
è¿åå¼ä¸ºæ件æéç±»åï¼èµå¼ç»ä¹åå®ä¹çåéãå¦æè¿åå¼ä¸ºNULLï¼ä»£è¡¨æå¼å¤±è´¥ï¼æ æ³åå ¥ã
4 对æ件è¿è¡åæä½ãCè¯è¨ä¸æå¾å¤åæ件çæ¥å£ï¼å æ¬fprintf, fwrite, fputs, fputcççã
åæä½å¯ä»¥æ§è¡å¤æ¬¡ã
5 å¨å ¨é¨åæä½å®æåï¼æ§è¡fcloseå½æ°å ³éæ件æéãè¿æ ·å°±å®ç°äºCè¯è¨åå ¥æ件ã
第一、你的结构体设计得有问题。
因为你的学号不是int, 是char*,OK?
应该改成:
typedef struct student
{
char id[3];
float score [3];
float rank;
}Student;
第二、如何正确从文件读取数据
按照你的文件格式,把数据读入结构体,其实很简单
int main ()
{
Student s;
FILE * fp;
fp=fopen("1.txt","r");
if (!fp)
{
printf("file cannot be opened");
exit(1);
}
fscanf(fp,"%s%f%f%f\n",s.id,&s.score[0],&s.score[1],&s.score[2]);
printf("%s %f %f %f\n",s.id,s.score[0],s.score[1],s.score[2]);
}
第三、到这里,你的所有问题都已经解决了
我上面提到的两点,你理解了,其实你说的问题就解决了,Right?记住:关键是要把学号看成char*
结贴吧追问
我说的是如何把结构体的内容写入文件!你说反了,这么大的标题—-—。先把id换成char试试,不过依旧不能给你分。
追答同学,你这样的态度就不大好,咱们既然来给你看问题,肯定是仔细看过了,你把读文件的功能实现了吗????嘿嘿,如果你理解了,写文件你会做不了???!!!
提问题要谦虚一点,你以为BAIDU的分是$啊!!!哈哈
如果我真会了,还用问吗。。。分给你我眼就瞎了。。。
追答好吧,同学,我的代码你只管拿去用,你的分数下次还可以接着用,呵呵。
还有,你的学号是以0开头的,如果用int能读到001,那我服了!!!
同学,你太可爱了,如果你是女生,我非娶了你不可!!!
程序应该是%¥#@*&)*……&)……
&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%
&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%
这段是核心代码 以下省略10000字追问
死边边去,别丢人。。。
另外一个不太重要的一点,id确实很少作为int类型的,因为有些id会很长,比如10位20位,这样int就存不下了,而用char数组存的话只需要10个字节20个字节就能存下,对于每一位也好比较。
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int unsigned id;
float score [3];
float rank;
}Student;
int main ()
{
Student s;
FILE * fp;
fp=fopen("C:\\f11.txt","r"); //尽量以可读方式打开
if (!fp)
{
printf("file cannot be opened");
exit(1);
}
//fscanf(fp,"%d %f %f %f",&s.id,&s.score[0],&s.score[1],&s.score[2]); 这一行拿到下面while语句里面
//fprintf(stdout,"%g",s.score[2]);
FILE * fw;
fw=fopen("C:\\f11a.txt","w"); //注意wb是以2进制形式打开文件,还有目录的格式
if (!fw)
{
printf("file cannot be opened");
exit(1);
}
while(!feof(fp))
{
fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);
s.rank=(s.score[0]+s.score[1]+s.score[2])/3;
fprintf(fw,"%03d\t%.1f\t%.1f\t%.1f\t%.1f\n", s.id, s.score[0], s.score[1], s.score[2], s.rank); //尤其注意fprintf和fwrite不同,fwrite是以二进制形式写文件,如果用fwrite的话将会显示乱码,fwrite和fread配套,fscanf和fprintf配套
}
fclose (fp);
fclose(fw);
return 0;
}本回答被提问者和网友采纳
至于读取数据方面我同意二楼的解释