| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 681 人关注过本帖
标题:读取文件时程序报错,调试了好久不知道如何解决
取消只看楼主 加入收藏
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
读取文件时程序报错,调试了好久不知道如何解决
程序代码:
#ifndef STUDENT_SYSTEM_H
#define STUDENT_SYSTEM_H

void Studentmassage_ShowMenu();
void AddItem();
void Display();
void Sort();
void Find();
void RemoveItem();
void t();
void ModifyItem();
struct  Student 
{ 
    char name[20]; 
    char Id[20];
    char sex[4];
    int age;
    int Cnum;       
    int Mnum;       
    int Enum;       
    int math;
    int sum;        
    int average;
};
typedef struct load
{
    char user_name[50];
    char password[50];
}mima;

void build_new();
int load_user();
int load_mima();
void write_file(struct Student *s);
void read_file(void);
#endif


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student_system.h"

void write_file(struct Student *s)
{
    FILE *fp_1;
    int mark=1;
    if((fp_1=fopen("list_student.txt","ab+"))==NULL)
        printf("打开文件失败");
    else
        while(s->name[0]!=NULL)
        {
            fwrite(&mark,sizeof(int),1,fp_1);
            fwrite(s,sizeof(Student),1,fp_1);
            printf("存储数据成功");
            system("pause");
            s++;
        }
        fclose(fp_1);
}


void read_file()
{
    FILE *fp_2;
    int mark;
    struct Student *s;
    s=(Student *)malloc(sizeof Student);
    if((fp_2=fopen("list_student.txt","rb"))==NULL)
        printf("打开文件失败");
    else
        while(fread(&mark,sizeof(int),1,fp_2)==1)
        {
            fflush(stdout);
            fread(s,sizeof(Student),1,fp_2);
            printf("读取数据成功\n");
            printf("%6s%6s%6s%6s%6s%6s%6s%6s%6s%6s\n","姓名","学号","性别","年龄","成绩1","成绩2","成绩3","成绩4","总成绩","平均成绩");
            printf("%6s%6s%6s%6d%6d%6d%6d%6d%6d%6d\n",s->name,s->Id,s->sex,s->age,s->Cnum,s->Enum,s->Mnum,s->math,s->sum,s->average);
            s++;
        }
        /*system("pause");*/
        free(s);
        fclose(fp_2);

}

只附上相关的代码
搜索更多相关主题的帖子: 如何 
2014-05-26 16:17
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
回复 4 楼 embed_xuel
判断是否存储数据的条件啊,如果输入了数据则s->name就一定不会是空
2014-05-26 16:53
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
无语,图片发不出来。只能摘抄了诊断信息

HEAP[student_system.exe]: Invalid address specified to RtlValidateHeap( 00360000, 00364438 )
Windows 已在 student_system.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 student_system.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 student_system.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。
2014-05-26 16:56
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
回复 3 楼 wp231957
只要是选择执行void read_file()这个函数,程序就直接崩溃了,问题很明显就是
程序代码:
while(fread(&mark,sizeof(int),1,fp_2)==1)
        {
            fflush(stdout);
            fread(s,sizeof(Student),1,fp_2);
            printf("读取数据成功\n");
            printf("%6s%6s%6s%6s%6s%6s%6s%6s%6s%6s\n","姓名","学号","性别","年龄","成绩1","成绩2","成绩3","成绩4","总成绩","平均成绩");
            printf("%6s%6s%6s%6d%6d%6d%6d%6d%6d%6d\n",s->name,s->Id,s->sex,s->age,s->Cnum,s->Enum,s->Mnum,s->math,s->sum,s->average);
            s++;

这里的代码出问题了。其中s++可能存在指针越界的错误
我写的这段程序的目的是一次性读取所有以追加模式保存在文件中的数据
2014-05-26 17:03
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
回复 7 楼 embed_xuel
额,s->name是一个地址无法作为判断条件啊,所有我用s->name[0](代表一个字符)是否为空来判断的。我没想到更好的判断条件,就只能这么做了
2014-05-26 17:06
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
额,这里确实错了,忘记加括弧了
但是执行void read_file()还是报相同的错误
2014-05-26 17:13
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
回复 10 楼 wp231957
Windows 已在 student_system.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 student_system.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 student_system.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。
依然是这样的错误,用断点调了半天就是不知道哪里错了
2014-05-26 17:15
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
回复 13 楼 embed_xuel
s=(Student *)malloc(sizeof(Student)*1000);

按照这样修改,也无济于事啊
2014-05-26 17:43
忘了_这一切
Rank: 3Rank: 3
来 自:星星
等 级:论坛游侠
威 望:1
帖 子:41
专家分:145
注 册:2014-4-25
收藏
得分:0 
问题请教高手后终于解决了,答案是在s=(Student *)malloc(sizeof(Student)*1000);后进行了一系列的s++,最后free(s)时由于s的地址已经发生改变,无法被free掉,导致程序崩溃。解决办法是
程序代码:
void read_file()
{
    
    FILE *fp_2;
    int mark;
    struct Student *s;

    s=(Student *)malloc(sizeof(Student)*1000);
    int p=(int)s;                                  //定义一个整形变量,让它保持s初始值
    if((fp_2=fopen("list_student.txt","rb"))==NULL)
        printf("打开文件失败");
    else
        while(fread(&mark,sizeof(int),1,fp_2)==1)
        {
            fflush(stdout);
            fread(s,sizeof(Student),1,fp_2);
            printf("读取数据成功\n");
            printf("%6s%6s%6s%6s%6s%6s%6s%6s%6s%6s\n","姓名","学号","性别","年龄","成绩1","成绩2","成绩3","成绩4","总成绩","平均成绩");
            printf("%6s%6s%6s%6d%6d%6d%6d%6d%6d%6d\n",s->name,s->Id,s->sex,s->age,s->Cnum,s->Enum,s->Mnum,s->math,s->sum,s->average);
            s++;
        }
        /*system("pause");*/
        free((Student*)p);      //这里实际上释放的是s分配的内存
        fclose(fp_2);        
        

}
2014-05-26 18:20
快速回复:读取文件时程序报错,调试了好久不知道如何解决
数据加载中...
 
   



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

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