Shuo
Shuo

Reputation: 491

fscanf in C not reading full lines?

This is so stupidly simple but I'm just having issues with it.

A text file has a header,

e.g.,

# 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,

And I'm trying to read each of these lines using fscanf.

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

resulting in this

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

So it's parsing the whitespace instead of newlines. Not sure what's happening.

Upvotes: 3

Views: 21311

Answers (3)

Oki Sallata
Oki Sallata

Reputation: 374

I recommend that you use fgets, but if you insist on using fscanf:

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

This will read a full line.

Upvotes: 10

wuliang
wuliang

Reputation: 749

Although %s may mean "string", but fscanf (as scanf) is not a greedy mathing one, you should tell it the seperator is "new line". And, You'd better to set maxinum buffer size to prevent buffer overflow.

#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);
}

Upvotes: 1

MByD
MByD

Reputation: 137282

The %s specifier in fscanf reads words, so it stops when reaching a space.

Use fgets to read a whole line.

Upvotes: 6

Related Questions