| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 377 人关注过本帖, 1 人收藏
标题:未处理异常,内存不可读
只看楼主 加入收藏
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:3 
未处理异常,内存不可读
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 1024
#define N 20
#define M 30
void read(FILE * fp,int (*ptr)[M]);
void writ(FILE * fp,const int (*ptr)[M]);
int main(void)
{
    FILE * fp1;
    FILE * fp2;
    char name[M],write[M];
    int memory[N][M];
    
//  输入要打开的文件名
    printf("input name of file and i will open it : ");
    gets(name);
    strcat(name,".txt");
    printf("input name of file and i will write something for it : ");
    gets(write);
    strcat(write,".txt");

    //  打开文件并建立缓冲
    if(NULL == (fp1 = fopen(name,"rb")))
    {
        fprintf(stderr,"Can't open file %s",name);
        system("pause");
        exit(1);
    }
    if(setvbuf(fp1,NULL,_IONBF,SIZE) != 0)
    {
        fprintf(stderr,"Can't create input buffer.");
        system("pause");
        exit(2);
    }
    if(NULL == (fp2 = fopen(write,"wb")))
    {
        fprintf(stderr,"Can't open file %s",write);
        system("pause");
        exit(1);
    }
    if(setvbuf(fp2,NULL,_IONBF,SIZE) != 0)
    {
        fprintf(stderr,"Can't create input buffer.");
        system("pause");
        exit(2);
    }
    read(fp1,memory);                            //  读取文件输入到数组
    if(ferror(fp1) != 0)                         //  查看是否正确读取
        fprintf(stderr,"Error in reading file %s",name);
    fclose(fp1);                              //  关闭文件
    writ(fp2,memory);                        //读取数组内容到文件
    if(ferror(fp2) != 0)
        fprintf(stderr,"Error in reading file %s",write);
    fclose(fp2);                             //  关闭文件
    system("pause");
    return 0;
}

void read(FILE * fp,int (*ptr)[M])
{
    int i;

    for(i = 0;i < 20;i++)
    {
        fread(ptr[i],sizeof(int),30,fp);     //  读取30块文件块,每块int大小
        ptr[i][30] = '\0';
    }
}
void writ(FILE * fp,const int (*ptr)[M])
{
    int i,j;
    static char table[] = " .':~*=&%@";     //  0~9转换为字符

    for(i = 0;i < 20;i++)
    {
        for(j = 0;j < 30;j++)
            fputc(table[ptr[i][j]],fp);    //  进行转换输出到文件
        putchar('\n');
    }
}


调试的时候说内存不可读,然后我就用逐过程调试
fputc(table[ptr[i][j]],fp);    //  进行转换输出到文件

这部的时候说 0x00411a63处有未处理异常:读取位置发生冲突
2014-02-17 16:54
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
收藏
得分:0 
我把fread()  函数改为fscanf()函数读取  就可以了  不知道这是为什么?
2014-02-17 20:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
上次你問fprintf()以什麽形式保存數據的時候,我就已經給你講解過相關知識,當時不接著追問到懂爲止,這會又問同類問題。

授人以渔,不授人以鱼。
2014-02-17 22:28
SaberLion
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:85
专家分:348
注 册:2014-1-4
收藏
得分:0 
回复 3楼 TonyDeng
额 上次你后来回答 没看到= =  这边也没收到提示。。
那就是说因为类型不同 文本里的数据是字符型的  如果用int类型读取 是会出错的
而用fscanf读取是用转换说明符将字符转成相应的类型保存是吧,而且因为文件里的数字有空格(一开始没注意到所以才想用fread的)所以计算机会知道读取到哪里停止 再从哪里开始读取下一个字符。。。
2014-02-18 08:10
快速回复:未处理异常,内存不可读
数据加载中...
 
   



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

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