Не правильно считывается строка через fgets()

#define STRING_SIZE 77
int main()
{
    FILE* list, * newFile;
    char str[STRING_SIZE];
    fopen_s(&list, "laptops.txt", "rt");
    int notesNum = 4;
    while (num < notesNum) {
        fgets(str, STRING_SIZE , list);
        printf("%d%s\n", num, str);
        num++;
    }
    fclose(list);
    return EXIT_SUCCESS;
}

Содержимое файла laptops.txt:

Acer Note Light 2699 5.6 02.0x11.8x08.3 100 040 10.4 1 1024x0768 60 0.774

ASW ND5123T 3489 7.2 02.3x11.8x10.1 133 032 12.1 1 1024x0768 70 1.300

ARMNote TS80CD 3699 7.2 02.0x11.5x08.3 133 064 11.3 1 1024x0768 75 1.300

AST Ascentia H50 4499 7.5 02.3x11.3x09.0 133 040 11.3 1 0800x0600 70 0.774

Ожидалось, что на экран построчно выведется содержимое файла laptops.txt. Вместо этого на экране было вот это:

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Harry

После присланного файла все понятно. У вас длина строки в файле строго равна 76 символам, потом идет перевод строки. но размер вашего буфера -

#define STRING_SIZE 77
char str[STRING_SIZE];

77, т.е. символ новой строки писать уже некуда...

В результате у вас fgets вынужден считывать в качестве первой строки ровно 76 символов. и выводить их. Второе чтение считывает пустую строку, вернее. один "\n" - отсюда и пустая строка. Третье читает вторую строку неполностью, четвертое - пустую строку...

Сделайте

#define STRING_SIZE 80

и посмотрите на результат...

→ Ссылка
Автор решения: DSuhoi

Пример рабочего кода. Подробнее о функции чтения строк здесь.

#include <stdio.h>  //Для printf, fgets, fopen, fclose, feof
#include <stdlib.h>

#define LEN 80 //длина принимаемой строки

int main (void)
{  
    FILE *mf;   //указатель на файл

    // указатель на область памяти, в которую будут помещаться считываемые строки
    char *str = (char*) malloc(LEN);

    mf = fopen("laptop.txt","rt");

    // Проверка открытия файла
    if (mf == NULL) {printf ("Ошибка\n"); return -1;}

    //Чтение (построчно) данных из файла в бесконечном цикле
    for(int cnt = 1;;++cnt){

        fgets (str,LEN*sizeof(*str),mf);  // Чтение одной строки  из файла

        if (feof(mf)){  //Проверка на конец файла или ошибку чтения
            printf ("\nЧтение файла закончено\n");
            break;}

        printf ("%d. %s",cnt,str);  //выводим считанную строку  на экран

    }

    fclose (mf);

    free(str);  //освобождаем память

    return 0;
}
→ Ссылка