问题描述
- C语言文件一小问题!求大神
-
#include"stdio.h"
#include"stdlib.h"
#define N 3
#define M 4
struct student
{
int num;
char name[20];
int score[M];
}stu[N];
int main()
{
int i,j;
FILE fp;
if((fp=fopen("shuju.txt","wb"))==NULL)
{
printf("文错误件打开n");
exit(0);
}printf("请分别输入%d同学们的学号、姓名、四个课程成绩n",N);
for(i=0;i<N;i++)
{
printf("请输入第%d个同学信息:",i+1);
scanf("%d%s",&stu[i].num,stu[i].name);
for(j=0;j<M;j++)
scanf("%d",&stu[i].score[j]);
fwrite(&stu[i],sizeof(struct student ),1,fp);
}
printf("%d个同学的信息已经存入磁盘文件中n",N);
fclose(fp);
if((fp=fopen("shuju.txt","rb"))==NULL)
{
printf("文错误件打开n");
exit(0);
}
printf("***********学生的信息是:*************n");
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(struct student ),1,fp);
printf("第%d个同学信息:",i+1);
printf("%dt%s",stu[i].num,stu[i].name);
for(j=0;j<M;j++)
printf("t%d",stu[i].score[j]);
printf("n");
fclose(fp);
}
return 0;
}
运行结果
疑问:
:
第一:为什么文本(txt)数据是这样的呢??求解?
第二:能把汉字存进文本文件中去吗??
解决方案
文件定义的是FILE fp? 不应该是FILE *fp么。。。。
另外您是用二进制方式写的文件,那么它将以自己的格式处理文件,所以您看不到原来文件的内容。
如果您想看到内容, 要修改
(1) 写打开fopen用"w"方式,不用"wb"
(2) 把所有fwrite改为fprintf具体写什么您得自己定义
例如fprintf(fp,"%s %d", name, score)之类的,具体格式其实和printf到屏幕一样,只是fprintf是写到文件里了
(3) 读打开也是"r",别用"rb"
(3) 再读文件的时候也不能用fread了,要用fscanf(fp,"%s%d");之类, 具体读什么也和scanf从键盘读一样。格式和您写入的相关。
不能一个结构体那么读了,只能和您输入数据那样按结构体的字段从文件里直接读。
解决方案二:
直接存二进制信息是最好的,虽然没法在记事本中直接看到,但是程序读取比较方便。
如果存储成文本,解析起来反倒麻烦。
解决方案三:
因为你是wb二进制方式写的文件。然后结构体中整体写入的。
解决方案四:
你这个不是文本文件,而是二进制文件。
你直接存的是结构体。
举例来说
int num=1,你存在文本文件中的是01 00 00 00,你在记事本打开,这4个字节都是不可识别的字符。
而你在记事本中写“1”,存入的其实是31。
解决方案五:
定义文件指针变量一般格式为:
FILE * 指针变量标识符;
一般定义为:FILE * p;
中文的话应该用“r+”或“w+”,“wb”是存储为二进制文件
解决方案六:
建议你学一些C#的东西
解决方案七:
1、首先FILE fp,应该改成FILE *fp;
2、fp = fopen("shuju.txt","w");
建议你去看一看C语言基础教程,里面的文件操作章节,希望对你有所帮助。