2012-05-07 3 views
1

Это настолько глупо, но у меня просто проблемы с ним.fscanf в C не читает полные строки?

Текстовый файл имеет заголовок,

например,

# 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 

Так это разборе пробелы вместо символов новой строки. Не уверен, что происходит.

ответ

5

Спецификатор %s в fscanf читает слова, поэтому он останавливается при достижении пробела.

Используйте fgets, чтобы прочитать целую строку.

+0

Закончено с использованием fgets. – Shuo

1

Хотя% s может означать «string», но fscanf (как scanf) не является жадным математическим, вы должны сказать, что сепаратор «новая строка». И, вы должны установить размер буфера maxinum для предотвращения переполнения буфера.

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

Я рекомендую вам использовать fgets, но если вы настаиваете на использовании fscanf:

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

Это будет читать полную линию.

+0

Спасибо за исправление .. –

+0

upvote для \ n в последнем –

Смежные вопросы