鱼C论坛

 找回密码
 立即注册
查看: 6555|回复: 9

对文件的写出写入操作以及一个缓冲区字符读入问题

[复制链接]
发表于 2013-6-26 20:07:47 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 Skuone 于 2013-6-26 20:09 编辑

加我QQ帮我在线调试下也行。 QQ截图20130626201041.gif
相关源代码请在附件下载。已经打包。 问题代码.zip (1.5 KB, 下载次数: 3) 麻烦各位针对这二个问题 解答下,在下感激不尽。:lol
function.h 头文件源代码:
1.gif
2.gif
3.gif




主源程序代码:

6.gif
7.gif


产生问题:

第一个问题:
QQ截图20130626195921.gif


第二个问题:

第一次菜单选择正确的 但是当第二次函数自动调用 begin函数 printf 出来了
QQ截图20130626200327.gif

我自己这样调试无果。。。

QQ截图20130626200558.gif


4.gif

最佳答案

查看完整内容

首先那个菜单错误的问题是因为 flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 default:,于是出现菜单错误 至于为什么会打印出11个N的话,在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个 修改 至于为什么不会打印信息 if(!strcmp(person_result.schoolnumber,"2")) 这 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-26 20:07:48 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-6-27 12:07 编辑

首先那个菜单错误的问题是因为

  1. #include<stdio.h>
  2. #include "function.h"
  3. #include <stdlib.h>


  4. int main (){
  5. bool begin();
  6. printf("                    ^ v ^ [欢迎登陆运动会分数统计系统]                        \n");

  7. while (true)
  8. {
  9.   if(!begin()){
  10.   
  11.   return 0;

  12. }

  13. }

  14. }
  15. bool begin(){
  16. bool ck;
  17. ck=true;

  18. printf("--------------------------------------------------------------------------------");
  19. printf(" 录入数据:a  | 打印各学校成绩单: b  | 打印团体总分报表 : c  | 退出系统 : q\n");
  20. printf("--------------------------------------------------------------------------------");

  21. char ch;
  22. //getchar();
  23. __Error:
  24. scanf("%c",&ch);
  25. switch (ch)
  26. {
  27. case 'a' :
  28.   {
  29.    add();
  30.    flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 default:,于是出现菜单错误
  31.    break;
  32.   }
  33. case 'b' :
  34.   {
  35.    pr_ge();
  36.    flushall();
  37.    break;
  38.   }
  39. case 'c' :
  40.   {
  41.    pr_tuan();
  42.    flushall();
  43.    break;
  44.   }
  45. case 'q' :
  46.   {
  47.    ck=false;
  48.    flushall();
  49.    break;
  50.   }
  51.    
  52. default:  
  53.    printf("菜单选择错误");goto __Error;break;
  54. }
  55. return ck;
  56. }
复制代码

flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 default:,于是出现菜单错误
至于为什么会打印出11个N的话,在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个
修改
  1. int pr_ge(){
  2. FILE *fpr ,*fpw;
  3. if((fpr=fopen("allsz.dat","rb"))==NULL) {printf("由于您未录入数据,打开数据文件失败!\n"); return 0;}
  4. fread(&person_result,sizeof(s_person_result),1,fpr);

  5. while(!feof(fpr)){



  6. if(!strcmp(person_result.schoolnumber,"2"))
  7. printf("%s,%s,%s,%s,%s,%f\n",person_result.playernumber,person_result.
  8. schoolnumber,person_result.projectnmber,person_result.sex,person_result.type,person_result.score);
  9. printf("n\n");
  10. fread(&person_result,sizeof(s_person_result),1,fpr);


  11. }
复制代码

至于为什么不会打印信息
if(!strcmp(person_result.schoolnumber,"2"))
这个语句的意思应该是如果学校编号是2就不打印吧?
关键是fread用错了
2.jpg
从上图你可以看出fread并不是那么智能的
它不会判断,只会满足你每个成员大小的要求
比如第一个成员你设置[5],那么它就会不加判断直接找5个塞进去
也就是不满足你的赋值要求啦,你自己改吧,伤。
就是自己判断了,用逗号来判断一个成员结束就行





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-27 13:08:52 | 显示全部楼层

fread
如果比较相同返回的是0
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-27 13:20:27 | 显示全部楼层
本帖最后由 Skuone 于 2013-6-27 13:24 编辑
メ㊣逆ご帅☆ 发表于 2013-6-27 12:06
首先那个菜单错误的问题是因为

flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 ...

说错了,是strcmp比较 相同返回的是0  

还有就是我person_result 是一个结构体,
而fread导入的大小正好是sizeof(s_person_result) 定义的person_result这个结构体的大小,导入1条。

而且我的读入方式是rb,存入的时候是wb以二进制存入的, rb二进制原样输出,只不过打印的时候才是输出ascii码的值。
未解决问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-27 13:28:23 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-6-27 12:06
首先那个菜单错误的问题是因为

flushall();//清除所有缓冲区,因为缓冲区中还有我们输入的数字,所以属于 ...

还有就是我打印出现如下错误   QQ截图20130627132826.gif


QQ截图20130627132928.gif
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-27 14:47:27 | 显示全部楼层
Skuone 发表于 2013-6-27 13:28
还有就是我打印出现如下错误

你可以看下我给你发的那张图
这个地方用fread的话
你可以看出成员schoolnumber 变成,4,5,6
projectnumber变成5,6
再看看我输入的内容,你可以看出,这并不是我所想要的数据
也就是这个情况不适合用fread或者用fread得处理下
也就是为什么你那图的那堆后面会多出一大截的原因
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-27 15:05:36 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-6-27 14:47
你可以看下我给你发的那张图
这个地方用fread的话
你可以看出成员schoolnumber 变成,4,5,6

QQ截图20130627150510.gif
为什么我的vs2012调试没有堆栈


还是不怎么明白为什么会出现这种情况,是为什么?
而不是这种情况怎么处理
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-27 15:45:56 | 显示全部楼层
我没用过VS2012,也没装、。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-29 19:00:15 | 显示全部楼层
{:7_154:}..........
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-29 21:43:58 | 显示全部楼层
Skuone 发表于 2013-6-27 15:05
为什么我的vs2012调试没有堆栈

自己设置的~~调用堆栈~~
{:7_175:}加油哦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-21 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表