2012-11-27 46 views
0

我正在使用CodeBlocks,GCC和使用C语言编写。我的代码如下:分割错误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); 
} 

老实说,我不知道为什么(为什么会这样困难的),但代码块是给我的错误是可怕的SIGSEV分段错误的feof线。当我没有做while循环时,fscanf会抛出Segmentation错误。请帮忙!我不经常在C工作,我记得现在为什么。即使是最简单的事情也很难。提前致谢。

更新: 其实我也有这个改变开行的工作(上一个):

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

如何与相对路径这项工作?

+0

'perror'只是打印一条消息。它不会终止程序。所以如果'fn'为空,就会发生不好的事情。 – Mat

+2

如果应该是'fopen',而不是'open',并且你的编译器应该警告你这个问题 - 你正在编译'gcc -Wall ...'我希望? –

+0

对不起,它正在发出警告。 @Mat我已经让程序返回,它是说word.txt不是一个有效的文件或目录,即使有一个word.txt与我正在运行的.exe文件在同一目录中 - 我错过了什么吗? –

回答

2

变化

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

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

open返回int,这是不一个FILE*feoffscanf期望FILE*不是一个int作为它的第一个参数,这就是feof()feof()的原因,如果删除它,fscanf() segfaults。

和其他人已经注意到的一样,将fscanf(fn, "%s", &word)更改为fscanf(fn, "%s", word)

+0

谢谢奥拉夫。请查看底部的更新。我仍然坚持为什么这不起作用。 –

+0

@DanielCasserly你是什么意思与“不工作”? –

+0

对不起奥拉夫。现在所有的工作,感谢指针。 (没有双关语意) –

1

假设词是一个char *(你的代码是不明确),该指令将带给你的问题:

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

仅仅通过改变它:

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

另外,我建议你使用fopen函数而不是open,因为fscanf和fopen提供的描述符一起工作。

+0

谢谢我认为fn值为null,但是,word.txt与.exe位于同一个文件夹中我缺少什么? –

+0

@DanielCasserly你确定这个词。txt'确实是一个二进制文件?如果不是,那么你应该使用'“r”而不是'“rb”'。 – 2012-11-27 22:30:50

+0

谢谢我刚才发现,(好吧,我查了一下) –