Ç 我想使用fscanf以下列格式读取文件。
//text file
push i
push o
pop
push i
pop
push a
一个单词,然后是一个由空格分隔的字符。然后将单词指定给指针或var,并为char指定相同的单词。但我不断收到分段错误。
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 :(得分:2)
指针data
未初始化,因此当fscanf
尝试取消引用它时,您会得到段错误。
您应该做的只是将其声明为char
(不是char *
),并将最后fscanf
参数更改为&data
:
while(fscanf(fp, "%s %c[^\n]", word, &data) != EOF) {
^
另外,printf
应该使用%c
作为第二个说明符,而不是%s
(因为您要打印单个字符)。
答案 1 :(得分: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);
但这很复杂。