的fscanf用C不读全行?(fscanf in C not reading full lines?

2019-06-24 05:30发布

这是如此的愚蠢简单,但我只是与它有问题。

一个文本文件,有一个头,

例如,

# Avizo BINARY-LITTLE-ENDIAN 2.1

define Lattice 496 384 470

Parameters {
    AlignTransform {
        slice0000 0 -0 -30 -1,
        slice0001 0 -0 -30 -1,
        slice0002 0 -0 -30 -1,

我试图读取每个使用的fscanf这些行。

   int i;
   for (  i = 0; i < 10; i++ ) {
     fscanf(fp, "%s\n", buf);  
     printf("%d) %s\n",i,buf);
   }

造成这种

0) #
1) Avizo
2) BINARY-LITTLE-ENDIAN
3) 2.1
4) define
5) Lattice
6) 496
7) 384
8) 470
9) Parameters

所以,它的解析换行符的空白代替。 不知道发生了什么。

Answer 1:

%s在说明符fscanf读取的话,那么达到的空间时,它停止。

使用fgets读一整行。



Answer 2:

我建议您使用fgets ,但如果你坚持要用fscanf

fscanf(fd, "%[^\n]\n", buff);

这将读取的全系列。



Answer 3:

虽然%s可能意味着“串”,但的fscanf(如scanf函数)是不是一个贪婪的mathing一个,你应该告诉它的分隔符是“新线”。 而且,你最好来设置参数最大缓冲区大小,以防止缓冲区溢出。

#include <stdio.h>

#define NAME_MAX    80
#define NAME_MAX_S "80"

int main(void)
{
    static char name[NAME_MAX + 1]; // + 1 because of null
    if(scanf("%" NAME_MAX_S "[^\n]", name) != 1)
    {
        fputs("io error or premature end of line\n", stderr);
        return 1;
    }

    printf("Hello %s. Nice to meet you.\n", name);
}


文章来源: fscanf in C not reading full lines?
标签: c newline scanf