Поток файла открыт, но ничего не выводится на консоль.Программа, кажется, не "закончена" - PullRequest
0 голосов
/ 21 января 2019

Я новичок в C и пытаюсь открыть файл и напечатать его содержимое построчно в консоль.

Исходный код прилагается вместе с парой снимков экрана, чтобы показать мою ситуацию. (Выделенная часть содержит каталоги моего компьютера и личную информацию). Как видно из скриншота, программа печатает «до», а не «после». Конечно, он также ничего не печатает из coc.txt.

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

#include <stdio.h>
#include <stdlib.h> // For exit()

const int MAX_LINE_LENGTH = 300;
int main() {

    FILE  *inputFile;
    inputFile = fopen("coc.txt", "r");
    char lineRead[MAX_LINE_LENGTH];
    printf("before\n");
    while(!feof(inputFile)) {
        fgets(lineRead, MAX_LINE_LENGTH, inputFile);
        puts(lineRead);
    }
    fclose(inputFile);
    printf("after\n");

}   

Консоль

screenshot of IDE

coc.txt

screenshot of text editor

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Убедитесь, что файл coc.txt и файлы read.c находятся в одной папке.Я выполнил ваш оригинальный код, и он отлично работает с VS 2017 на Windows 10.

0 голосов
/ 21 января 2019

Вот предлагаемая альтернатива (еще не проверенная):

#include <stdio.h>

#define MAX_LINE_LENGTH 300
#define NULL 0

int main(int argc, char *argv[]) {

    FILE  *inputFile;
    char fname[MAX_LINE_LENGTH], lineRead[MAX_LINE_LENGTH];

    /* Get filename from cmd-line */
    if (argc != 2) {
        printf ("USAGE: progname <fname>\n");
        return 1;
    }

    /* Try to open file */
    if ((inputFile = fopen("coc.txt", "r")) == NULL) {
        perror("Could not open file");
        return 2;
    }

    /* Now read the file, and echo back a line at a time */
    printf("before...\n");
    while(fgets(lineRead, MAX_LINE_LENGTH, inputFile) != NULL) {
        printf ("%s", lineRead);
    }
    printf("\n...after\n");

    /* Cleanup and exit */
    fclose(inputFile);
    return 0;
}

Изменения:

  1. Обязательно получите "возврат" из main ().

    Как правило, изящный «return» из main () предпочтительнее системного вызова «exit ()».

  2. Считайте ввод, затем для проверки EOF (fgets () == NULL).

  3. Убедитесь, что вы открыли файл перед чтением.

  4. Вместо того, чтобы жестко кодировать имя файла, мы читаем его из командной строки.

  5. Вместо того, чтобы положить () (который всегда добавляет символ новой строки, независимо от того, имеет ли строка уженовая строка), мы используем printf ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...