标题:C语言二进制文件读写问题,求高手赐教!
只看楼主
陪你看雪ly
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-2-16
结帖率:100%
已结贴  问题点数:10 回复次数:11 
C语言二进制文件读写问题,求高手赐教!
只要进行两次输入,然后再输出数据。就会出错,不知怎么回事。。。
void input_date()
{
FILE *fp, *frecord_date;
char filename[20];
int i, j;
float sum;

    printf("请输入新建文件名:");
    gets(filename);

if((fp=fopen(filename,"wb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}

if((frecord_date=fopen("record_date.txt","r+"))==NULL)
{
printf("无法打开文件!");
exit(0);
}
fscanf(frecord_date,"%d",&date_sum);
fclose(frecord_date);

fseek(fp,0,SEEK_END);//把文件指针调到最后,再写数据
printf("请输入学生数据,以学号0结束\n");
stu[0].num=1;//保证输入开始

for(i=date_sum; ; i++)
{
    printf("NO. ");
    scanf("%ld",&stu[i].num);
    getchar();

    if(stu[i].num==0)//退出输入
        break;

    printf("name: ");
    gets(stu[i].name);

    sum=0;
    for(j=0; j<3; j++)
    {
        printf("第%d科:",j+1);
        scanf("%f",&stu[i].score[j]);
        sum=sum+stu[i].score[j];
    }
    getchar();

    stu[i].aver=sum/3;

    if(fwrite(&stu[i], sizeof(struct student), 1, fp)!=1) //二进制读写
    {
        printf("error!");
        fclose(fp);
    }


}
printf("执行完毕!");
fclose(fp);


date_sum=i; //记录数据总数

if((frecord_date=fopen("record_date.txt","w"))==NULL)
{
printf("无法打开文件!");
exit(0);
}

fprintf(frecord_date,"%d",date_sum);//记录数据

fclose(frecord_date);

}
///////////////////////////////////////
void output_date()
{
FILE *fp, *frecord_date;
char filename[20];
int i, j;

printf("请输入需要打开的文件名:");
gets(filename);

if((fp=fopen(filename,"rb"))==NULL)
{
printf("无法打开文件!");
exit(0);
}

if((frecord_date=fopen("record_date.txt","r"))==NULL) //打开记录数据数目的文件
{
printf("无法打开文件!");
exit(0);
}

fscanf(frecord_date,"%d",&date_sum);
printf("date_sum=%d\n",date_sum);

fseek(fp,0,SEEK_SET);

for(i=0; i<date_sum; i++)
{
    if(fread(&stu[i], sizeof(struct student), 1, fp)!=1)//读数据
    {
    printf("error!");
    fclose(fp);
    }

    printf("NO.%d\n",stu[i].num);
    printf("name:%-10s\n",stu[i].name);

for(j=0; j<3; j++)
{
    printf("第%d科: ",j+1);
    printf("%-5.2f\n",stu[i].score[j]);
}
    printf("平均分:%-5.2f\n",stu[i].aver);

    printf("\n");
}

printf("执行完毕!");
fclose(frecord_date);
fclose(fp);
搜索更多相关主题的帖子: led possible company 二进制 C语言 
2012-02-17 08:45
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
得分:5 
Debug,出错后,看调用堆栈,定位到出错的位置就知道了

为游戏狂~~!!    大家努力编哈!
2012-02-17 08:54
陪你看雪ly
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-2-16
得分:0 
回复 2楼 smallmoon521
我的是win7系统,弄不了单步调试,还有就是我还不懂栈。。。悲催啊
2012-02-17 11:51
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
得分:0 
不能吧,Win7也应该能调试啊? 用的什么IDE
我不是让你单步调试,是看调用堆栈,看错出在哪,再结合代码看
VC的调用堆栈在这

为游戏狂~~!!    大家努力编哈!
2012-02-17 12:39
陪你看雪ly
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-2-16
得分:0 
回复 4楼 smallmoon521
我是不懂栈啊,不会看,看不出来。。我懂的方法几乎都用了,实在没办法,所以找高手指导指导,,
2012-02-17 17:06
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
得分:0 
针对VC6编辑器讲的:

F5调试程序,正常输入数据,程序出错后,都是空指针或访问非法地址的错,
点错误框的确定,将其关掉.然后点上面那个工具栏中的CallStack,就可以看高调用过程,双击某行就可以跳到对应位置
这样就知道哪里出的问题了

为游戏狂~~!!    大家努力编哈!
2012-02-17 17:10
陪你看雪ly
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-2-16
得分:0 
回复 6楼 smallmoon521
我都无语,我调试不了,没什么作用。。。还有就是那个call stack一直都是灰色,用不了,汗。。。
2012-02-17 17:27
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
得分:0 
Debug下才可以用CallStack

怎么调试不了?
把你操作的步骤发上来

为游戏狂~~!!    大家努力编哈!
2012-02-17 17:42
陪你看雪ly
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-2-16
得分:0 
回复 8楼 smallmoon521
还是你教我吧,我只是会一点点。。。加上我有两个调试功能用不了,我检查程序基本不用调试功能
2012-02-17 17:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:5 
你把輸入得到的文件貼出來看看

授人以渔,不授人以鱼。
2012-02-17 17:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-361048-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.246974 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved