从TXT文本中读取数据(数值为0-9),将数据转换为指定字符后再写入文件,但程序结束时出时出现错误中断。为什么

mk112255 2017-07-05 10:54:18
int main(void)
{
char str[HIGH][WIND];
int ch;
int i, j, x;
FILE *fp;
char filename[LINE] = { "f:\\map.txt" };
char st[] = { " .':~*=@%#" };

if ((fp = fopen(filename, "a+")) == NULL)

{
fprintf(stderr, "不能打开文件 %s \n", filename);
exit(EXIT_FAILURE);
}
for (i = 0; i < HIGH; i++)
{
for (j = 0; j < WIND; j++)
{
if (fscanf(fp, "%d", &ch) == 1)
{
str[i][j] = st[ch];

}
else
{
getchar();

}
}
}

for (i = 0; i < HIGH; i++)
{

for (j = 0; j < WIND; j++)
{

printf("%c", str[i][j]);
}
printf("\n");
}
for (i = 0; i < HIGH; i++)
{

for (j = 0; j < WIND; j++)
{

fprintf(fp,"%c", str[i][j]);
}
printf("\n");
}



if (fclose(fp) != 0)
{
fprintf(stderr, "关闭文件失败");
exit(EXIT_FAILURE);
}

getchar();
getchar();
getchar();
getchar();
getchar();
getchar();
getchar();
return 0;
}
...全文
210 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-07
  • 打赏
  • 举报
回复
fflush或fclose后,fprintf的内容才真正写到磁盘文件中。
mk112255 2017-07-07
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
找到原因是str数组益出,但是为什么结果写进文件fp呢? for (i = 0; i < HIGH; i++) { for (j = 0; j < WIND; j++) { fprintf(fp,"%c", str[i][j]); //fputc(str[i][j], fp); } fprintf(fp,"\n"); } 这方法不可行吗?还是fopen 打开文件只能执行一次,读取后要关闭了才能再进行写入?
赵4老师 2017-07-06
  • 打赏
  • 举报
回复
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
paschen 2017-07-05
  • 打赏
  • 举报
回复
可能访问str或者st时越界了
赵4老师 2017-07-05
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
paschen 2017-07-05
  • 打赏
  • 举报
回复
引用 4 楼 mk112255 的回复:
[quote=引用 2 楼 paschen 的回复:] 可能访问str或者st时越界了
是在程序结束的时候弹出的,而且数组的内容无法写入文件f:\\map.txt内[/quote] 越界不一定直接崩溃,从你提示看,你的栈被破坏了,函数结束时检查程序被中断了下来 你可以单步跟踪程序运行,查看读到的变量是多少,观察分析原因
自信男孩 2017-07-05
  • 打赏
  • 举报
回复
引用 4 楼 mk112255 的回复:
[quote=引用 2 楼 paschen 的回复:] 可能访问str或者st时越界了
是在程序结束的时候弹出的,而且数组的内容无法写入文件f:\\map.txt内[/quote] str[i][j] = st[ch];这句ch是以%d读出来的,但是作为st的下标,可能已经越界了。 建议把ch打印出来,看看是否越界了。
mk112255 2017-07-05
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
可能访问str或者st时越界了
是在程序结束的时候弹出的,而且数组的内容无法写入文件f:\\map.txt内
jena_wy 2017-07-05
  • 打赏
  • 举报
回复
读出来的ch比st的下标大会数组越界!可以查一下读到值

69,382

社区成员

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

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