0

我有一个文件:

hello:12312
Bye:333
Hey:22

所以我使用 fscanf 阅读它

 FILE *file = fopen( argv[1], "r" );

        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else
        {

            while(fscanf(file, "%[^:]:%d", word, &integer) != EOF)
            {
                printf("word: %s, integer: %d\n", word, integer);
            }

            fclose( file );
        } 

这就是我得到的:

word: hello, integer: 12312
word:
Bye, integer: 333
word:
Hey, integer: 22

所以显然除了第一个单词之外还有一个额外的空格,为什么会发生这种情况?

4

4 回答 4

3

%[^:]将接受行尾。如果您想跳过将前导空格放入word尝试:

 " %[^:]:%d"
于 2013-05-09T16:03:05.590 回答
3

来自fscanf()

在尝试解析输入之前,除 [、c 和 n 之外的所有转换说明符都会消耗并丢弃所有前导空白字符。

并且\n之后将保留输入流"%d"

要更正向格式说明符添加前导空格以跳过空格:

while(fscanf(file, " %[^:]:%d", word, &integer) == 2)
{
}

将 更改!= EOF== 2以防止接受格式"hello:""hello".

于 2013-05-09T16:04:51.137 回答
1

在字符串格式的开头添加空格" %[^:]:%d"。这将避免 scanf 中的换行问题

 while(fscanf(file, " %[^:]:%d", word, &integer) != EOF)
于 2013-05-09T16:03:13.157 回答
1

因为当您使用 *scanf() 函数读取整数时,不会使用以下换行符。

于 2013-05-09T16:04:10.270 回答