2017-02-22 6 views
0

Я пытаюсь написать простую программу на языке C, которая загружает текстовый файл, печатает первую строку на экране, ждет, когда пользователь нажмет кнопку ввода, а затем распечатает следующую строку, и так далее.C - Печать строк из файла с getline()

Как только аргумент принимает текстовый файл, который загружается как «база данных» потока. Я использую функцию getline() для этого, в соответствии с примером this. Он компилируется отлично, успешно загружает текстовый файл, но программа никогда не входит в while-loop, а затем выходит.

#include <stdio.h> 
#include <stdlib.h> 

FILE *database = NULL; // input file 

int main(int argc, char *argv[]) 
{ 
    /* assuming the user obeyed syntax and gave input-file as first argument*/ 
    char *input = argv[1]; 

    /* Initializing input/database file */ 
    database = fopen(input, "r"); 
    if(database == NULL) 
    { 
     fprintf(stderr, "Something went wrong with reading the database/input file. Does it exist?\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("INFO: database file %s loaded.\n", input); 

    /* Crucial part printing line after line */ 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 

    while((read = getline(&line, &len, database)) != -1) 
    { 
     printf("INFO: Retrieved line of length %zu :\n", read); 
     printf("%s \n", line); 
     char confirm; // wait for user keystroke to proceed 
     scanf("%c", &confirm); 
     // no need to do anything with "confirm" 
    } 

    /* tidy up */ 
    free(line); 
    fclose(database); 
    exit(EXIT_SUCCESS); 
} 

Я попробовал его с fgets() - я также разместить этот код -, но то же самое есть: он никогда не попадает в то время как петлю.

Это может быть что-то очень очевидное; Я новичок в программировании.

Я использую gcc-компилятор на Kali Linux.

+1

Что говорит отладчик, когда вы проходите через код? –

+0

Благодарим вас за ответы; Я нашел свою ошибку. Это действительно смущает, потому что код работает, только мой текстовый файл каким-то образом съелся; возможно, я не закрыл его должным образом, и все его содержимое было удалено, поэтому, конечно, значение getline() было EOF/-1. – c2ethanol

+0

Я бы также проверил return 'scanf()' здесь, – RoadRunner

ответ

1

Измените scanf на fgetline, используя stdin в качестве параметра файла.

1

Вы должны пройти через это в отладчике, чтобы убедиться, что ваш запрос о том, что он никогда не входит в цикл while, верен.

Если он действительно никогда не входит в цикл while, это обязательно потому, что getline() вернул -1. Либо файл действительно пуст, либо у вас есть ошибка при чтении файла.

man getline говорит:

В случае успеха, GetLine() и getdelim() возвращает количество символов чтения, в том числе разделителя характера, но не включая Расторжение визирных нулевые байты ('\ 0'). Это значение может использоваться для обработки встроенных нулевых байтов в строке read.

Обе функции возвращают -1 при прочтении строки (включая конечное состояние ). В случае ошибки errno устанавливает значение .

Таким образом, вы должны улучшить свой код, чтобы проверить на наличие ошибок потока и иметь дело с errno - вы должны сделать это, даже если ваш код работает, потому что EOF не единственная причина для функции вернуть -1.

int len = getline(&line, &len, database); 
    if(len == -1 && ferror(database)) { 
     perror("Error reading database"); 
    } 

Вы можете написать более подробный код для работы с errno более явными способами.

К сожалению, обработка этого полностью может сделать ваш код немного более подробным - добро пожаловать на C!

-1

отлично работает на моей платформе gcc ver.4.8.4 на Ubuntu Linux. Какая у вас версия gcc?

+0

Это не ответ. – slim

+0

Добро пожаловать в переполнение стека. Я знаю, что это расстраивает, когда вы новичок и не можете добавлять комментарии, но добавление комментария в качестве ответа приведет к тому, что ваша полезная информация будет пропущена. Лучше потратить время, получить необходимую репутацию (50 баллов), и, пока у вас не будет репутации, дайте хорошие ответы на (хорошие) вопросы, где вы можете дать реальный ответ (или задать хорошие вопросы), хотя в некоторых случаях это сложнее пути). Местные жители обычно предоставляют комментарии, похожие на это, когда это необходимо. –

+0

@JonathanLeffler Roger это! – Vickey

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