2013-09-29 117 views
0

c 我想使用fscanf以以下格式读取文件。如何使用fscanf读取文件

//text file 
push i 
push o 
pop 
push i 
pop 
push a 

一个单词然后是一个空格分隔的字符。然后将这个单词分配给一个指针或var,并且这个单词也是一样的。但我不断收到分段错误错误。

FILE * fp("text.txt", "r"); 
char * word = malloc(21 * sizeof *word); 
char data; 
int c, size , i, prev; 
while(fscanf(fp, "%s %c[^\n]", word, data) != EOF) { 
    printf("%s %c", word, data); 
} 
+0

你在哪里打开你的文件 –

+0

以上几行代码,但我把它添加到这个snipit谢谢! –

+0

发现我的问题,因为我有用于fscanf格式化的“%s%c”,如果它读入一个pop单词,它将在数据char的下一行的第一个p中读取。所以我的一些话将会丢失那里的第一个字母任何想法如何正确地格式化这个,所以当我达到一个流行音乐后没有一个字符的空间。它不会只是将下一行的第一个字符分配给数据 –

回答

2

指针data未初始化,所以当fscanf尝试取消对它的引用,你得到的段错误。

你应该做的是刚刚宣布,把它当成一个char(不是char *),并改变过去fscanf参数&data什么:

while(fscanf(fp, "%s %c[^\n]", word, &data) != EOF) { 
            ^

此外,printf应该使用%c第二符,不是%s(因为您正在打印单个字符)。

+0

谢谢!这工作,但现在我可以看到我有另一个问题,它打印出结果它随机切断了一些单词的第一个字母。 –

+0

查看更新的答案。 –

+0

我做到了,但它仍然给我同样的问题 –

0

一个问题是,您正在尝试读取一个字符后跟一个字符,但有些行没有字符后面的字符。 fscanf对此不是一个好的选择,因为它不擅长区分空格和换行 - 两者都只是考虑“空白”,所以它会读取多行尝试匹配其模式,忽略换行符。

取而代之的是,读行fgets,然后使用sscanf解析每一行。

如果你真的必须使用的fscanf,你可以使用类似:

do { 
    rv = fscanf(fp, "%s%*[ ]%c", word, &data); 
    if (rv == 1) { 
     /* read just a word -- no data character after it */ 
    } else if (rv >= 2) { 
     /* read a word and a data character */ 
    } 
} while (rv != EOF); 

但变得复杂。