2015-09-18 3 views
0

Ожидаемый ввод в мою программу для моего задания - это что-то вроде ./program "hello" < helloworld.txt. Проблема с этим, однако, что я должен проанализировать каждую строку, которая находится в программе, так что я использовал охранник в конце строки, как:C - Чтение из файла с последней строкой

while((c = getchar()) != EOF) { 
    if (c == '\n') { 
    /*stuff will be done*/ 

Однако, моя проблема состоит в том, что если в helloworld.txt файл содержит:

hello 
world 

Он будет читать только первую строку (до второй последней строки, если должны были быть больше линий).

Для этого быть фиксированным, я должен строго сделать новую линию таким образом, что helloworld.txt выглядит примерно так:

hello 
world 
// 

Есть еще один способ обойти это?

+3

У вашего оригинального файла есть символ новой строки в конце 'world'? Некоторые редакторы добавляют их, некоторые - нет. Возможно, «делайте вещи» на EOF, а также '\ n'? – DevSolar

+0

@DevSolar Я просто предполагаю худшее, в котором человек, отмечающий это, использует тестовый файл, у которого нет новой строки. – Laefica

+0

Но в этом случае вы читали символы *, но не делали «материал» *, когда вы сталкиваетесь с EOF (и предположительно выходите). Вот почему ваша последняя строка не появляется. – DevSolar

ответ

5

Исправить ваш алгоритм. Вместо того, чтобы:

while((c = getchar()) != EOF) { 
    if (c == '\n') { 
     /* stuff will be done */ 
    } else { 
     /* buffer the c character */ 
    } 
} 

Do:

do { 
    c = getchar(); 
    if (c == '\n' || c == EOF) { 
     /* do stuff with the buffered line */ 
     /* clear the buffered line */ 
    } else { 
     /* add the c character to the buffered line */ 
    } 
} while (c != EOF); 

Но обратите внимание, что вы не должны использовать значение переменной c если EOF.

3

Вам необходимо переструктурировать свою программу, чтобы она могла «делать вещи» на EOF, если она прочитала любые символы с предыдущего перевода строки. Таким образом, окончательная строка без конца будет по-прежнему обрабатываться.

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