分割故障 C 语言读一个简单的单词

Segmentation Fault C language reading a simple word

提问人:Daniel Casserly 提问时间:11/28/2012 最后编辑:Daniel Casserly 更新时间:11/28/2012 访问量:306

问:

我正在使用 CodeBlocks、GCC 和 C 语言进行写作。我的代码如下:

char word[50];
FILE *fn;
fn = open("word.txt", "rb");
if(fn == NULL) perror("File not opened");
while(!feof(fn))
{
    fscanf(fn, "%s", word);
}

文本文件中只有一个词(目前是“蝙蝠侠”)。我尝试了此代码的各种版本,包括以下内容:

char* word;
char = malloc(50);
FILE *fn;
fn = open("word.txt", "rb");
if(fn == NULL) perror("File not opened");
while(!feof(fn))
{
    fscanf(fn, "%s", &word);
}

老实说,我不知道为什么(以及为什么这应该如此困难),但 CodeBlocks 给我的错误是 feof 线上可怕的 SIGSEV 分段错误。当我不执行 while 循环时,fscanf 会抛出 Segmentation 错误。请帮忙!我不经常用C语言工作,我现在还记得为什么。即使是最简单的事情也可能非常困难。提前致谢。

更新: 我实际上已经通过将开放行更改为:

fn = fopen("C://Temp//word.txt", "rb");

这如何与相对路径一起使用?

C GCC 分段-故障 FEOF

评论

0赞 Mat 11/28/2012
perror只是打印一条消息。它不会终止程序。因此,如果为 null,就会发生不好的事情。fn
2赞 Paul R 11/28/2012
如果应该是,不是 - 你的编译器应该警告你这一点 - 你正在用我希望?fopenopengcc -Wall ...
0赞 Daniel Casserly 11/28/2012
是的,对不起,它正在发出警告。@Mat我已经使程序返回,并且它说 word.txt 不是有效的文件或目录,即使有一个单词.txt与我正在运行的.exe文件位于同一目录中 - 我是否遗漏了什么?
0赞 Paul R 11/28/2012
不要忽视编译器警告 - 它们的存在是有充分理由的!
0赞 Kev 11/28/2012
第二个代码段无法编译。你的意思是 word = malloc(50) 而不是 char = malloc(50) 吗?

答:

1赞 Hernan Velasquez 11/28/2012 #1

假设 word 是 char *(你的代码不清楚),这个指令会给你带来问题:

fscanf(fn, "%s", &word);

只需通过以下方式更改它:

fscanf(fn, "%s", word);

另外,我建议您使用 fopen 函数而不是 open,因为 fscanf 使用 fopen 提供的描述符。

评论

0赞 Daniel Casserly 11/28/2012
谢谢我认为 fn 值为 null,但是,单词 .txt 与 .exe 位于同一文件夹中,我错过了什么?
0赞 11/28/2012
@DanielCasserly你确定这真的是一个二进制文件?如果不是,则应使用 代替 。words.txt"r""rb"
0赞 Daniel Casserly 11/28/2012
谢谢,我刚才发现了(好吧,我查了一下)
2赞 Olaf Dietsche 11/28/2012 #2

改变

fn = open("word.txt", "rb");

fn = fopen("word.txt", "rb");

open 返回 ,它不是 .Feoffscanf 期望 a not a int 作为其第一个参数,这就是原因,如果删除它,则会导致段错误。intFILE*FILE*feof()fscanf()

正如其他人已经指出的那样,更改为 .fscanf(fn, "%s", &word)fscanf(fn, "%s", word)

评论

0赞 Daniel Casserly 11/28/2012
谢谢奥拉夫。请参阅底部的更新。我仍然坚持为什么这不起作用。
0赞 Daniel Casserly 11/28/2012
对不起,奥拉夫。现在一切都在工作,感谢您的指点。(没有双关语的意思)