全局文件指针声明存在一些问题,因此我遇到了分段错误。 GDB显示它专门出现在fscanf
函数的sourceToStream
行。任何帮助将不胜感激。
#define SOURCE_CODE "source_code.txt"
#define CHARACTER_STREAM "character_stream.txt"
static FILE* in_fp;
static FILE* out_fp;
void sourceToStream() {
char buf;
while(fscanf(in_fp, "%c", &buf) != EOF) {
if (buf == '\%')
while(buf!='\n' && buf !='\r' && buf!=EOF)
fscanf(in_fp, "%c", &buf);
if(buf != '\n' && buf != '\r' && buf != '\t' && buf != ' ')
fprintf(out_fp, "%c", buf);
}
}
int main() {
in_fp = fopen(SOURCE_CODE, "r");
out_fp = fopen(CHARACTER_STREAM, "w");
sourceToStream();
fclose(in_fp);
fclose(out_fp);
return 0;
}
答案 0 :(得分:2)
GDB在执行第一个fopen()后给出以下输出(gdb)p in_fp $ 1 =(FILE *)0x0
(gdb)p * in_fp无法访问地址0x0处的内存
这意味着您的文件无法正确打开,或者更具体地说,没有打开source_code.txt进行阅读。
由于您未在open命令中包含路径,因此请确保它们位于当前工作目录(执行二进制文件的目录)中,并确保您具有读/写权限。
对于fopen()
,您可以检查生成的文件句柄是否为NULL,然后打印出错误消息:
in_fp = fopen(SOURCE_CODE, "r");
if(in_fp == NULL) {
perror("Failed to open the source");
return EXIT_FAILURE;
}
例如,如果文件不存在,您将获得类似的内容:
无法打开源:没有此类文件或目录