提问人:george 提问时间:10/13/2012 最后编辑:Keith Thompsongeorge 更新时间:10/13/2012 访问量:830
FEOF 或 FSanFf 错误
feof or fscanf error
问:
我正在做一个程序,我使用开发C++。运行时,我的程序终止。
调试时,它显示“分段错误”。我不知道它是否会进入无限循环。
我不知道问题是否出在代码中。while(!feof(program))
fscanf(...)
谁能帮忙解决这个问题?请看下面的程序:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
fpos_t curDesStart,curDesEnd;
fpos_t curDesLocBackup,curDes;
char *label,*opc,*operands;
char *curMacroName;
FILE *namTab,*desTab,*temp,*program;
namTab=fopen("namTab.txt","rw");
desTab=fopen("desTab.txt","rw");
temp=fopen("temp.txt","w");
program=fopen("program.txt","r");
while(!feof(program))
{
fscanf(program,"%[^\n]%[^\n]%[^\n]",label,opc,operands);
if(!strcmp(label,"MACRO"))
{
fprintf(desTab,"%s%s%s\n",label,opc,operands);
fgetpos(desTab,&curDesStart);
strcpy(curMacroName,label);
while(!strcmp(opc,"MEND"))
{
fscanf(program,"%s%s%s",label,opc,operands);
}
fprintf(desTab,"%s%s%s\n",label,opc,operands);
fgetpos(desTab,&curDesEnd);
fprintf(namTab,"%s%ld%ld\n",curMacroName,curDesStart,curDesEnd);
}
else
{
while(!feof(namTab))
{
fgetpos(desTab,&curDesLocBackup);
fscanf(namTab,"%s%ld%ld",curMacroName,curDesStart,curDesEnd);
if(!strcmp(curMacroName,label))
{
fsetpos(desTab,&curDesStart);
fscanf(desTab,"%s%s%s\n",label,opc,operands);
fprintf(temp,".%s%s%s\n",label,opc,operands);
do{
fprintf(temp,"%s%s%s\n",label,opc,operands);
fgetpos(desTab,&curDes);
}while(curDes<=curDesEnd);
fsetpos(desTab,&curDesLocBackup);
fsetpos(namTab,0);
}
else
{
fprintf(temp,"%s%s%s\n",label,opc,operands);
}
}
}
}
fclose(program);
fclose(namTab);
fclose(desTab);
fclose(temp);
getch();
return 0;
}
答:
0赞
Olaf Dietsche
10/13/2012
#1
此代码存在几个问题:
- 如果 program.txt 不存在,fopen() 将返回 NULL
- fscanf(%[...]) 或 fscanf(%s) 需要指向 char 的指针,该指针必须提供足够的 文本读取的空间加上终止 NUL 字节(请参阅 http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)
- fscanf(%ld) 需要指向 long 的指针,而不是 long
0赞
twalberg
10/13/2012
#2
您既没有为任何要指向的存储分配存储,也没有将它们初始化为指向其他内容。因此,您实际上是将随机数传递到 ,这会导致未定义的行为,其中程序崩溃是其中一种可能的化身。char *
fscanf
评论
feof()
feof()
ferror()