2017-01-25 2 views
0

Я пытаюсь получить одну целую строку из некоторого текстового файла вместо одного слова, пока он не встречает белое пространство, вот исходный код:Как читать одну целую строку из текстового файла, используя <

#include <stdio.h> 

void main() { 
    int lineNum=0; 
    char lineContent[100]; 

    scanf("%s", &lineContent); 
    printf("%s\n", lineContent); 
} 

И здесь мой текстовый файл, называемый test.txt, контент, содержащий 2 строки:

111 John Smith 100 98 1.2 2.5 3.6 
222 Bob Smith 90 91 3.2 6.5 9.6 

И я бегу его с помощью следующей команды:

a.out < test.txt 

Мой оу tput просто:

111 

Что я хочу:

111 John Smith 100 98 1.2 2.5 3.6 

Конечно, я могу просто использовать в то время как заявление и читать рекурсивно до тех пор, пока не встречает EOF, но это не то, что я хочу. Я просто хочу прочитать одну целую строку за каждый раз, когда я читаю из файла.

Как я могу это сделать?

спасибо.

+2

(1) Используйте 'fgets':' scanf ("% s", & lineContent); printf ("% s \ n", lineContent); '->' fgets (lineContent, sizeof lineContent, stdin); printf ("% s", lineContent); '. Также 'while (fgets (...)! = NULL) fputs (lineContent, stdout);' – BLUEPIXY

+2

(2) 'scanf ("% s ", &Content);' -> 'scanf ("% 99 [^ \ n]% * c ", lineContent);'. Также 'while (1 == scanf ("% 99 [^ \ n]% * c ", lineContent)) printf ("% s \ n ", lineContent);' – BLUEPIXY

ответ

2

fgets() является наиболее удобной стандартной библиотечной функцией для чтения файлов по одной строке за раз. GNU getline() еще удобнее, но он нестандартен.

Если вы хотите использовать scanf(), однако, то вы можете сделать это с помощью дескриптора [ поля вместо s:

char lineContent[100]; 

scanf("%99[^\n]", &lineContent); 
getchar(); 

Обратите внимание на использовании явной ширины поля для защиты от наката границы lineContent в том случае, если встречается длинная строка. Отметим также, что дескриптор [ отличается от s тем, что [ не пропускает начальные пробелы. Если для вас важно сохранить ведущие пробелы, то scanf с полем s является не стартером.

getchar() считывает завершающую строку новой строки, предполагая, что она есть, и что scanf() не считывал 99 символов, не доходя до конца строки.

1

Если вы хотите прочитать строку за строкой, используйте fgets() или getline() (доступно на системах POSIX) вместо scanf(). scanf() останавливает первый пробел (или соответствующий сбой) для %s.

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