2014-01-15 2 views
0

У меня есть текстовый файл, который выглядит следующим образом:чтения и обработки текстового файла строка за строкой в ​​C

1;Einstein;Albert;3914-1948-4 
2;Newton;Isaac;1941-5525-2 
... 

и структуры, как этот

typedef struct { 
int Nr; 
char FName[30]; 
char LName[30]; 
char ID[12]; 
} student; 

У меня есть функция, которая принимает Строка структурирована как одна строка из вышеприведенного файла и структура и сохраняет данные из строки в структуре.

Теперь мне нужно прочитать одну строку из файла, обработать ее с помощью моей функции и перейти к следующей строке.

Я бы сделал это в цикле, который перескакивал бы из строки в линию и создавал нового студента типа переменной для каждой строки.

Но я не знаю, как это сделать. fgets позволяет читать только одну строку, и я не вижу способ перейти к следующей строке.

Есть ли способ сделать это, что не слишком сложно?

+1

Каждый вызов 'fgets()' возвращает _one_ линию. Чтобы прочитать следующую строку, снова вызовите 'fgets()'. – chux

ответ

1

Каждый вызов fgets возвращает новую строку до EOF (т. Е. «Конец файла»).

См: fgets

Для голого примера контурной петли для чтения с помощью fgets см:

fgets - get a string from a stream

Однако, если вы не можете быть уверены в выделении буфера достаточно долго удерживайте строку, часто лучше использовать fgetc, чтобы читать каждый символ по одному - не волноваться, файл ввода-вывода по-прежнему буферизуется, а не читает персонаж за раз - и собирает текст в токены, как вы идете вперед, а не занимаетесь линиями длиннее, чем любой буффе r, которые вы можете потребовать, чтобы вы могли обрабатывать токены, разделенные между одним заполненным буфером и следующим.

+0

, но он говорит: «Чтение останавливается после EOF или новой строки. Если прочитана новая строка, она сохраняется в буфере. Заканчивается нулевой байт (aq \ 0aq), который сохраняется после последнего символа в буфере». поэтому он перестанет читать после первой строки – user3004619

+0

Ну, EOF не проблема, все готово. Но в случае новой строки следующий вызов 'fgets' будет читать символы после новой строки, т. Е. Следующей строки. – Ned

+1

@ user3004619 Это для одного вызова. Если вы снова его вызовете, вы получите еще одну строку и так далее, пока EOF – pinkpanther

1

Вы можете сделать так:

str char *str; 
    str = fgets(fptr); 
    while (str != EOF) 
    { 
     printf ("%s", str); 
     str = fgets(fptr); 
    } 
Смежные вопросы