Вопрос по чтению строк из файла в C - PullRequest
1 голос
/ 01 мая 2020
  int line = 0;
        char input[MAX_INPUT_SIZE];
        while(fgets(input, MAX_INPUT_SIZE, inputFile))
        {
            printf("%s", input);
            line++;
        }

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

Кроме того, MAX_INPUT_SIZE = 1025.

Мне было интересно, что произойдет, когда я прочитаю действительно большой файл , что происходит с input каждый раз, когда я использую fgets?

Записывает ли fgets случайным образом в input? как я могу узнать, где каждая строка, которую я читаю, начинается и заканчивается в input?

Хотелось бы получить некоторое понимание, спасибо.

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

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

int fseek(FILE *stream, long offset, int whence);

fgets строка за строкой получит этот файл (не случайно).

From man page:

 char *fgets(char *s, int size, FILE *stream);

fgets () считывает из потока не более одного символа меньшего размера и сохраняет их в буфере, указанном s. Чтение прекращается после EOF или новой строки . Если читается новая строка, она сохраняется в буфере. Завершающий нулевой байт ('\ 0') сохраняется после последнего символа в буфере

0 голосов
/ 01 мая 2020

Мне было интересно, что происходит, когда я читаю действительно большой файл, что происходит с input каждый раз, когда я использую fgets?

Предыдущее содержимое input переписано.

как узнать, где каждая строка, которую я читаю, начинается и заканчивается на входе?

Краткая история

fgets() читает строку (текст до '\n' включительно) в строку (символы до присоединенного окончания нулевой символ ).

Символы строки начинаются с input[0].

Количество прочитанных символов: strlen(input)


Более длинная история

A строка в C обычно имеет окончание '\n'. Последняя строка ввода может / не может иметь '\n'.

каждая строка, состоящая из нуля или более символов плюс завершающий символ новой строки. Требует ли последняя строка завершающего символа новой строки, определяется реализацией. C17dr § 7.21.2 2

fgets() останавливается досрочно

char *fgets(char * restrict s, int n, FILE * restrict stream);

fgets() читает данные и затем добавляет нулевой символ .

fgets() прекращает чтение при 4 условиях:

1) читается '\n'.

2) * читается 1067 * символов.

3) произошел конец файла.

4) Произошла ошибка ввода (редко).

Для кода обучающегося достаточно предоставить большой входной буфер, очень похожий на код OP и проверьте возвращаемое значение. Для меня я бы использовал буфер размера 2x с наибольшим ожидаемым размером.

char input[MAX_INPUT_SIZE * 2];
while(fgets(input, sizeof input, inputFile)) {
  input[strcspn(input, "\n")] = '\0'; // Lop off potential \n if desired.
  ...
}

Чтение нулевых символов

A '\0' редко встречается чтение висты, но все же возможно. Это испортило использование strlen(), чтобы найти число прочитанных символов. Чтобы справиться с подобным, он попадает в другой код, который, вероятно, теперь не нужен OP.

0 голосов
/ 01 мая 2020

При отсутствии ошибок чтение останавливается с новой строки или при заполнении буфера.

fgets(buf, SIZE, f);
len = strlen(buf);
if (buf[len - 1] == '\n') {
    //full line read from file
    //buf[len+1] to buf[SIZE-1] are not changed from their previous values
} else {
    //very long line in file
    //repeat fgets for more of the line
    //if len != SIZE-1 there was some error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...