fscanf参数无效

MFunction 2015-09-21 06:42:12
VS2015下调试,Dev C++下调试都出错。VS2015调试时指向stdio.h的fscanf的参数错误,Dev C++直接表示编译的程序无响应然后返回0。小白求问这是为什么?是代码的问题还是编译器的问题?代码原型是刘汝佳的算法白书的数据统计II。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
FILE *fin, *fout;
fin = fopen("data.in", "rb");
fout = fopen("data.out", "wb");
const int boundary = 0x7FFFFFFF;
int x, max = -boundary, min = boundary, numbers = 0, sum = 0;
while (fscanf(fin, "%d", &x) == 1)
{
if (x > boundary || x < -boundary) return 6;
if (x < min) min = x;
if (x > max) max = x;
numbers++;
sum += x;
}
fprintf(fout, "%d %d %d", max, min, sum / numbers);
fclose(fin);
fclose(fout);
return 0;
}



...全文
305 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-10-12
  • 打赏
  • 举报
回复
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
赵4老师 2015-09-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
    FILE *fin, *fout;
    fin = fopen("data.in", "rb");
    if (NULL==fin) {
        printf("Can not open file data.in!\n");
        return 1;
    }
    fout = fopen("data.out", "wb");
    const int boundary = 0x7FFFFFFF;
    int x, max = -boundary, min = boundary, numbers = 0, sum = 0;
    while (fscanf(fin, "%d", &x) == 1)
    {
        if (x > boundary || x < -boundary) return 6;
        if (x < min) min = x;
        if (x > max) max = x;
        numbers++;
        sum += x;
    }
    fprintf(fout, "%d %d %d", max, min, sum / numbers);
    fclose(fin);
    fclose(fout);
    return 0;
}
wang0635 2015-09-22
  • 打赏
  • 举报
回复
fscanf、fprintf往往是对文本文件读写的,打开方式是r、w,而不是二进制方式的rb、wb,他们与fread、fwrite配套
做或不做 2015-09-22
  • 打赏
  • 举报
回复
我猜测不是代码问题 也不是编译器问题。 编译器很少出问题 出问题几乎都是优化导致的异常 你应该接触不到 所以不要怀疑编译器当遇到问题呢时。 别说你刚学 就算学啦2年的C 你问他 在你学习生涯中 你遇到过几个编译器问题 导致程序逻辑异常的换个编译器就正常啦的。 不是特别底层 很少接触这类问题。如果是书上的代码 我感觉错的可能也比较低,写书的也不是白痴,都能写书啦,水准应该 不比你差。只是一般人写说 存在一种信息的不对称性,对于运行这个程序 作者并没有把一个新手在第一次运行这个程序会 出现的惯性思维考虑到,也没有注意提示什么的。 我猜测问题应该是这样的。 1.data.in , data.out 这俩个文件存在吗? 2.如果存在 你把他们放置的位置是.exe的同一目录吗?
  • 打赏
  • 举报
回复
判断下fopen的返回值
MFunction 2015-09-22
  • 打赏
  • 举报
回复
引用 1 楼 hnwyllmm 的回复:
图片看不太清,fin是NULL吗?
错误报的是这个,但是fin赋值了。
MFunction 2015-09-22
  • 打赏
  • 举报
回复
引用 2 楼 dustpg 的回复:
"传递了一个无效参数视为严重错误", 这么大的字没看到么, 下面显示_Stream为NULL
但是fin赋值了,不知为何是NULL
MFunction 2015-09-22
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
    FILE *fin, *fout;
    fin = fopen("data.in", "rb");
    if (NULL==fin) {
        printf("Can not open file data.in!\n");
        return 1;
    }
    fout = fopen("data.out", "wb");
    const int boundary = 0x7FFFFFFF;
    int x, max = -boundary, min = boundary, numbers = 0, sum = 0;
    while (fscanf(fin, "%d", &x) == 1)
    {
        if (x > boundary || x < -boundary) return 6;
        if (x < min) min = x;
        if (x > max) max = x;
        numbers++;
        sum += x;
    }
    fprintf(fout, "%d %d %d", max, min, sum / numbers);
    fclose(fin);
    fclose(fout);
    return 0;
}
变量还是被编译器优化了。但是加了volatile修饰依旧是被优化了。。。
MFunction 2015-09-22
  • 打赏
  • 举报
回复
引用 5 楼 q3733353520 的回复:
判断下fopen的返回值
找到问题了,变量被编译器优化了。但是加了volatile修饰依旧是被优化了。。。
MFunction 2015-09-22
  • 打赏
  • 举报
回复
引用 5 楼 q3733353520 的回复:
判断下fopen的返回值
找到问题了,变量被编译器优化了。但是加了volatile修饰依旧是被优化了。。。
dustpg 2015-09-21
  • 打赏
  • 举报
回复
"传递了一个无效参数视为严重错误", 这么大的字没看到么, 下面显示_Stream为NULL
羽飞 2015-09-21
  • 打赏
  • 举报
回复
图片看不太清,fin是NULL吗?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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