c语言用fread读取文件时的问题,求教各位大佬

m0_46848246 2020-06-29 09:59:44
前两个可运行,第三个无法运行,且三段代码都在读取后如果使用printf输出到屏幕时就会乱码,比如文件里时20190001,输出是959524914。请各位大佬们帮忙看看,指出问题所在。
...全文
229 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Simple-Soft 2020-06-29
  • 打赏
  • 举报
回复
如果还有问题,加我q吧:3405187170然后把源代码发给我,如果可以的话
Simple-Soft 2020-06-29
  • 打赏
  • 举报
回复
什么开发工具?
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 3 楼 Simple-Soft 的回复:
你加个断点在那里,调试一下,看一下m的值,再看一下gra
怎么加断点?我刚学习c语言很多东西不是很懂。说到m的值的话第三个它就是不显示m的值,然后就直接结束程序了。至于前两段代码中m的值明显少于我在文件中的,第一个文件中我有1000个数据,然后它统计出来的m=944;第二个应该有100,却只有44;然后我用printf输出过读取的数据,比如本来文件里面是20190001,但输出的却是959524914。
Simple-Soft 2020-06-29
  • 打赏
  • 举报
回复
你加个断点在那里,调试一下,看一下m的值,再看一下gra
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 1 楼 Simple-Soft 的回复:
在读第三个的时候,先把m清零
有清零的,我这三段代码目前是分开写的
Simple-Soft 2020-06-29
  • 打赏
  • 举报
回复
在读第三个的时候,先把m清零
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 18 楼 Tryagain2006 的回复:
引用 15 楼 m0_46848246 的回复:
[quote=引用 13 楼 Tryagain2006 的回复:] 我不明白,为什么用函数 fopen_s,不用 fopen ?
我的VS2019用fopen会报错,scanf、fscanf、gets都是这样
应该是警告性的错误提示吧?不用管。[/quote]
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 18 楼 Tryagain2006 的回复:
引用 15 楼 m0_46848246 的回复:
[quote=引用 13 楼 Tryagain2006 的回复:] 我不明白,为什么用函数 fopen_s,不用 fopen ?
我的VS2019用fopen会报错,scanf、fscanf、gets都是这样
应该是警告性的错误提示吧?不用管。[/quote]不是,如果用scanf这些就运行不了
Tryagain2006 2020-06-29
  • 打赏
  • 举报
回复
引用 15 楼 m0_46848246 的回复:
引用 13 楼 Tryagain2006 的回复:
我不明白,为什么用函数 fopen_s,不用 fopen ?
我的VS2019用fopen会报错,scanf、fscanf、gets都是这样

应该是警告性的错误提示吧?不用管。
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 14 楼 Tryagain2006 的回复:
我现在初步判断是:你打开的时候按照 二进制文件方式,在函数getgra 中用 fprintf 写入数据,这个函数是以文本方式将数据写入文件的。 而在函数 addgra中,你有采用了 fread 来读文件,这样就造成了文件操作不一致。 我建议:先整理一下思路,确定就是 用 文本文件保存 数据,还是用用 二进制文件保存数据。然后根据文件性质,决定是否要 采用 fread 进行操作。
写入和读取都是二进制的
Tryagain2006 2020-06-29
  • 打赏
  • 举报
回复
如果决定采用文本文件保存数据,则使用 fprintf 和 fscanf 函数进行文本文件操作。
如果决定采用二进制文件保存数据,则使用 fwrite 和 fread 函数进行二进制文件操作。
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 13 楼 Tryagain2006 的回复:
我不明白,为什么用函数 fopen_s,不用 fopen ?
我的VS2019用fopen会报错,scanf、fscanf、gets都是这样
Tryagain2006 2020-06-29
  • 打赏
  • 举报
回复
我现在初步判断是:你打开的时候按照 二进制文件方式,在函数getgra 中用 fprintf 写入数据,这个函数是以文本方式将数据写入文件的。
而在函数 addgra中,你有采用了 fread 来读文件,这样就造成了文件操作不一致。

我建议:先整理一下思路,确定就是 用 文本文件保存 数据,还是用用 二进制文件保存数据。然后根据文件性质,决定是否要 采用 fread 进行操作。
Tryagain2006 2020-06-29
  • 打赏
  • 举报
回复
我不明白,为什么用函数 fopen_s,不用 fopen ?
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 9 楼 天外怪魔 的回复:
代码和文件麻烦贴出来。 ------------------------------------------------------------------------------------------./ 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元!
完整的暂时不好贴出来,因为我现在还在分部分来写,没有进行统合
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 8 楼 Tryagain2006 的回复:
给个程序代码吧,真不愿意自己再输入一遍。
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<dos.h> #include<string.h> #define N 1500 /*最大学生数*/ #define M 60 /*最大课程数*/ #define K 15000 /*最大成绩数*/ typedef struct student { int stuID; char stuname[10]; char sex; int age; char department[16]; }STUDENT; /*表一,学生的基本信息*/ typedef struct course { int couID; char couname[10]; char forcou[10]; int credit; }COURSE; /*表二,课程信息*/ typedef struct grade { int sID; int cID; int gra; }GRADE; /*表三,成绩信息*/ void getgra(GRADE gra[], int n) { int i, j; FILE* fp3; for (i = 0;i < n;i++) { gra[i].sID = 20190001 + i / 10; j = rand() % 50; gra[i].cID = 101 + j; gra[i].gra = ((100 - 40 + 1) * rand() / (RAND_MAX + 1.0) + 40); } if ((fopen_s(&fp3, "D:/gradata.txt", "wb+")) != 0) { printf("can't open!\n"); return; } for (i = 0;i < 10000;i++) fprintf(fp3, "%-12d\t%-5d\t%-5d\t\n", gra[i].sID, gra[i].cID, gra[i].gra); fclose(fp3); printf("文件已生成!\n"); } void addgra( GRADE gra[]) { int i, m = 0; char ch[2]; FILE* fp3; if ((fopen_s(&fp3, "D:/gradata.txt", "rb+")) != 0) { printf("can't open!\n"); return; } else { printf("文件:学生-课程成绩信息已打开\n"); while (!feof(fp3)) { if ((fread(&gra[m], 12, 1, fp3)) == 1) { printf("%d\n", gra[m].sID); m++; //统计已有记录数// } } printf("现在有%d条记录\n", m); fclose(fp3); } if (m == 0) printf("No record!\n"); if ((fopen_s(&fp3, "D:/gradata.txt", "ab")) != 0) { printf("can't open!\n"); return; } fread(&gra[m], 12, m, fp3); printf("是否输入学生信息?(y/n):"); gets_s(ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf_s("%d", &gra[m].sID); printf("课程号:"); scanf_s("%d", &gra[m].cID); printf("成绩:"); scanf_s("%d", &gra[m].gra); fprintf(fp3, "%-12d\t%-5d\t%-5d\t\n", gra[m].sID, gra[m].cID, gra[m].gra); printf("信息已被保存!\n"); m++; printf("是否继续?(y/n):"); gets_s(ch); } fclose(fp3); printf("OK!\n"); } void main() { GRADE gra[K]; getgra(gra,10000); addgra(gra); } 这里是其中一部分,主要求助的问题都在里面了。如果需要其他部分我另发
天外怪魔 2020-06-29
  • 打赏
  • 举报
回复
代码和文件麻烦贴出来。 ------------------------------------------------------------------------------------------./ 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元! 独孤九剑,万佛朝宗,三花聚顶,五气朝元!
Tryagain2006 2020-06-29
  • 打赏
  • 举报
回复
给个程序代码吧,真不愿意自己再输入一遍。
m0_46848246 2020-06-29
  • 打赏
  • 举报
回复
引用 5 楼 Simple-Soft的回复:
什么开发工具?
vs2019

33,311

社区成员

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

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