提问人:Daniel Casserly 提问时间:11/28/2012 最后编辑:Daniel Casserly 更新时间:11/28/2012 访问量:306
分割故障 C 语言读一个简单的单词
Segmentation Fault C language reading a simple word
问:
我正在使用 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");
这如何与相对路径一起使用?
答:
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
返回 ,它不是 .Feof
和 fscanf
期望 a not a int 作为其第一个参数,这就是原因,如果删除它,则会导致段错误。int
FILE*
FILE*
feof()
fscanf()
正如其他人已经指出的那样,更改为 .fscanf(fn, "%s", &word)
fscanf(fn, "%s", word)
评论
0赞
Daniel Casserly
11/28/2012
谢谢奥拉夫。请参阅底部的更新。我仍然坚持为什么这不起作用。
0赞
Daniel Casserly
11/28/2012
对不起,奥拉夫。现在一切都在工作,感谢您的指点。(没有双关语的意思)
评论
perror
只是打印一条消息。它不会终止程序。因此,如果为 null,就会发生不好的事情。fn
fopen
open
gcc -Wall ...