Мне было интересно, что происходит, когда я читаю действительно большой файл, что происходит с 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.