Не правильно считывается строка через 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 шт):
После присланного файла все понятно. У вас длина строки в файле строго равна 76 символам, потом идет перевод строки. но размер вашего буфера -
#define STRING_SIZE 77
char str[STRING_SIZE];
77, т.е. символ новой строки писать уже некуда...
В результате у вас fgets вынужден считывать в качестве первой строки ровно 76 символов. и выводить их. Второе чтение считывает пустую строку, вернее. один "\n" - отсюда и пустая строка. Третье читает вторую строку неполностью, четвертое - пустую строку...
Сделайте
#define STRING_SIZE 80
и посмотрите на результат...
Пример рабочего кода. Подробнее о функции чтения строк здесь.
#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;
}

