c++读取文件时 引发异常:读取访问异常

哈撒keyi 2019-01-06 09:09:44
...全文
1450 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一倾而尽 2019-01-13
  • 打赏
  • 举报
回复
没有实际存放的空间吧
weixin_44472794 2019-01-10
  • 打赏
  • 举报
回复
学习了谢谢正在找解决方案
zerocool2028 2019-01-10
  • 打赏
  • 举报
回复
根据你资料,如果最后一行为“21 19”,如果没有'\n',那么在获取到21后,在获取19时,岂不是循环for (k = 0; !(*ptr == '>' || *ptr == '/t' || *ptr == '/n'); ptr++, k++)就无法结束,所以就会导致内存越界访问。
另外,建议将代码优化一下,可以更快、更简洁、更明了。
木易木水 2019-01-09
  • 打赏
  • 举报
回复
学习学习,天天向上
哈撒keyi 2019-01-08
  • 打赏
  • 举报
回复
引用 5 楼 我还在迷路 的回复:
崩溃处的跳出循环条件呢? ptr在一直自增没有停止条件,肯定会数据越界的呀

while( *ptr == ' ' || *ptr == '\t')
ptr++;
这段代码一样也会出现数组越界
还有for(int u)的这个循环,也要加上ptr本身的结束判断


最后再说句,下次再贴代码不要用截图,添加c/c++代码,别人也好给你指出来问题,图片代码很惹人烦的
不好意思啊我第一次用这个论坛问问题。我下次一定添加代码
哈撒keyi 2019-01-08
  • 打赏
  • 举报
回复
引用 4 楼 林多 的回复:
指针指向一个不确定的值(非法的地址),自然不允许对指针解引用(*)了,访问权限就冲突了(没有权限)。

对ptr指向的值,要判断一下,看看不是到字符串的结尾了。如果到末尾了,就不要让ptr++了。

一下代码示例。。如果其他地方有相似的问题,也要判断一下。


bool isEndLine = false;
while (*prt == ' ' || ptr == '\t') {
ptr++
// 到结尾了,再ptr++,就会导致访问非法地址
if ('\0' == *ptr) {
isEndLine = ture;
break; // jump while
}
}

if (isEndLine) {
continue;
}

int u=0;
for(;...;....) {
int k = 0;
for (k = 0; !(*ptr == '>' || *ptr == '/t' || *ptr == 'n'); ptr++, k++) {
// 到结尾了,再ptr++,就会导致访问非法地址
if ('\0' == * ptr) {
isEndLine = true;
break;
}
....
}

if (isEndLine) {
break;
}
}

// 这个就不要这么判断了。判断u的值。
// if (*ptr =! *)
if ( 5 == u)
xxxxxxx

谢谢我懂了,不会用指针我后来直接用数组读了。。感觉很蠢
我还在迷路 2019-01-08
  • 打赏
  • 举报
回复
崩溃处的跳出循环条件呢? ptr在一直自增没有停止条件,肯定会数据越界的呀 while( *ptr == ' ' || *ptr == '\t') ptr++; 这段代码一样也会出现数组越界 还有for(int u)的这个循环,也要加上ptr本身的结束判断 最后再说句,下次再贴代码不要用截图,添加c/c++代码,别人也好给你指出来问题,图片代码很惹人烦的
林多 2019-01-07
  • 打赏
  • 举报
回复
指针指向一个不确定的值(非法的地址),自然不允许对指针解引用(*)了,访问权限就冲突了(没有权限)。

对ptr指向的值,要判断一下,看看不是到字符串的结尾了。如果到末尾了,就不要让ptr++了。

一下代码示例。。如果其他地方有相似的问题,也要判断一下。


bool isEndLine = false;
while (*prt == ' ' || ptr == '\t') {
ptr++
// 到结尾了,再ptr++,就会导致访问非法地址
if ('\0' == *ptr) {
isEndLine = ture;
break; // jump while
}
}

if (isEndLine) {
continue;
}

int u=0;
for(;...;....) {
int k = 0;
for (k = 0; !(*ptr == '>' || *ptr == '/t' || *ptr == 'n'); ptr++, k++) {
// 到结尾了,再ptr++,就会导致访问非法地址
if ('\0' == * ptr) {
isEndLine = true;
break;
}
....
}

if (isEndLine) {
break;
}
}

// 这个就不要这么判断了。判断u的值。
// if (*ptr =! *)
if ( 5 == u)
xxxxxxx


赵4老师 2019-01-07
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1 14 15
//2 11 10
//3 6 4
//4 7 13
//5 9 21
//6 19 3
//7 1 5
//8 8 8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1 14 15
//其它内容
//2 11 10
//其它内容
//3 6 4
//其它内容
//4 7 13
//其它内容
//5 9 21
//其它内容
//6 19 3
//其它内容
//7 1 5
//其它内容
//8 8 8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL 80 //每行最大字符数
#define MAXCITY 100 //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32 //NAME最大长度
struct S {
char NAME[MAXNAMEL+1];
int DIMENSION;
struct D {
int NO;
int X;
int Y;
} DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
f=fopen("data.txt","r");
if (NULL==f) {
printf("Can not open file data.txt!\n");
return 1;
}
st=0;
n=0;
while (1) {
if (NULL==fgets(ln,MAXCPL,f)) break;
if (st==0) {
if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
} else if (st==1) {
if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
} else if (st==2) {
if (0==strcmp(ln,"DATA\n")) st=3;
} else if (st==3) {
if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
n++;
if (n>=MAXCITY || n>=s.DIMENSION) break;
}
}
}
fclose(f);
printf("s.NAME=[%s]\n",s.NAME);
printf("s.DIMENSION=%d\n",s.DIMENSION);
for (i=0;i<n;i++) {
printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
}
return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8



乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream!
使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
哈撒keyi 2019-01-06
  • 打赏
  • 举报
回复
我又双叒来了,在线等好急啊
哈撒keyi 2019-01-06
  • 打赏
  • 举报
回复
有人吗?有人吗?大佬帮忙看

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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