это вопрос для новичков. Прошу прощения, но я не могу заставить его работать.
У меня есть текстовый файл с макетом:
movie a
2000
720p
movie b
2002
1080p
movie c
2004
480p
И мой код выглядит так:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SOURCE "test.txt"
#define S 50
typedef struct Movie
{
char title[50];
int year;
char quality[7];
}Movie;
int main (void)
{
FILE *f1;
int i = 0;
char buf[3];
int temp;
Movie *movie = NULL;
movie = (Movie*)malloc(sizeof(Movie));
if ((f1 = fopen(SOURCE, "r")) == NULL)
{
perror ("src error!");
printf ("exiting!");
exit (1);
}
while (1)
{
movie = (Movie*)realloc(movie, ((i+1)*sizeof(Movie)));
if (!movie)
{
perror ("mem error");
exit (1);
}
//fgets(movie[i].title, S, f1);
// fscanf(f1, "%s", buf);
// printf("%s", buf);
fscanf(f1, "%[^\n]", movie[i].title);
fscanf(f1, "%d", &movie[i].year);
fscanf(f1, "%s", movie[i].quality);
i++;
if (feof(f1))
break;
}
fclose(f1);
int j=0;
for (;j<=i;j++)
{
printf ("%d :: %s\n ",j, movie[j].title);
printf ("%d :: %d\n ",j, movie[j].year);
printf ("%d :: %s\n\n ",j, movie[j].quality);
}
return 0;
}
Возникла проблема с чтением из файла в структуру При выполнении программы она как-то портится, сохраняет строки в неправильные переменные и т. д. Я пробовал читать строки с помощью fgets, но не могу понять. Любая помощь приветствуется. Спасибо
Обновлено: Это результат, который он производит. Похоже на действительно прямолинейную и простую программу. Что я делаю неправильно? Спасибо
0 :: movie a
0 :: 2000
0 :: 720p
1 ::
1 :: 0
1 :: movie
2 :: b
2 :: 2002
2 :: 1080p
3 ::
3 :: 0
3 :: movie
4 :: c
4 :: 2004
4 :: 480p
5 ::
5 :: 0
5 ::
Здравствуйте, я добавил фрагмент вывода. Не могли бы вы взглянуть? Спасибо
Связанный: Как читать / разбирать файлы на C. FAQ.
user3121023 Ваше решение сработало. Большое вам спасибо. Хорошего дня





После третьего fscanf в цикле следующим символом в файловом буфере является новая строка. На следующей итерации цикла fscanf, использующий спецификатор формата %[^\n], ничего не читает, поскольку останавливается на новой строке. Это выбрасывает последующие чтения.
Вам нужно использовать новую строку после последнего чтения в цикле:
fscanf(f1, "%[^\n]", movie[i].title);
fscanf(f1, "%d", &movie[i].year);
fscanf(f1, "%s", movie[i].quality);
fgetc(f1);
Ваше решение решило эту проблему. Большое спасибо. Хорошего дня.
"... это как-то перепуталось". Это слишком неопределенно. Попробуйте сузить круг вопросов. Добавить отладочную информацию. Проверить промежуточные данные. Используйте отладчик. Придумайте минимальный воспроизводимый пример.