, но это просто создание бесконечного l oop.
Эта строка вашего кода: while ((read = getline(&line, &len, list)) != 1)
Если строка не содержит 1
символа ( просто перевод строки), это будет бесконечный l oop. Функция POSIX getline()
вернет -1
(не EOF
, даже если EOF
равно обычно -1), когда файл полностью прочитан. Поэтому измените эту строку на:
while ((read = getline(&line, &len, list)) != -1)
Но я не вижу, чтобы вы использовали значение read
внутри этого l oop, так что это было бы лучше:
- Fix 1:
while (getline(&line, &len, list) != -1)
И внутри этого l oop я вижу: printf("%d. %s", item, line);
Вы можете найти очень старые реализации getline()
, которые не включают перевод строки; в этом случае, если вы хотите, чтобы ваш вывод выводился в отдельных строках, вам нужно поставить \n
:
- Fix 2:
printf("%d. %s\n", item, line);
Однако, если вы используете более современную реализацию, она сохранит символ новой строки в соответствии со спецификацией POSIX.
Также, если самая последняя «строка» в файле не заканчивается новой строкой, вы все равно можете добавить ее. В этом случае вы можете сохранить длину чтения и использовать ее для определения наличия новой строки в конце строки.
Также кажется, что по некоторым причинам пропускается первое слово
Из-за int letterCount = fscanf(list,"%s",chars);
То, что fscanf
читает первое слово вашего файла. Теперь указатель файла находится в этой позиции (конец первого слова), и дальнейшее чтение файла будет происходить из этого места.
Итак, после считывания первого слова переместите указатель файла в начало файла. из файла:
Fix 3:
int letterCount = fscanf(list,"%s",chars);
fseek(list, 0, SEEK_SET); // <-- this will reposition the file pointer as required