Чтение файла на C и копирование содержимого в массив структур - PullRequest
0 голосов
/ 06 ноября 2018

Я изучал C в течение нескольких недель, и я застрял пару дней с этим вопросом.

Я пытаюсь прочитать файл с информацией о фильмах и скопировать его в массив структур.

main(){

struct movies{

    char name[30];
    char director[30];
    char yearOfRelease[30];
    char budget[30];
    char image[30];
    char genre[30];
};

struct movies mvArray[100];

struct movies data;

FILE *readingText;
readingText = fopen("movies.txt", "r");
char c[150];
int lines = 0;

do{

    fgets(c, 150, readingText);

    if(lines % 6 == 0)
    {
        strcpy(data.name, c);


    }

    if(lines % 6 == 1)
    {
        strcpy(data.director, c);
    }



    if(lines % 6 == 3)
    {
        strcpy(data.budget, c);
    }
    if(lines % 6 == 4)
    {
        strcpy(data.image, c);
    }
    if(lines % 6 == 5)
    {
        strcpy(data.genre, c);
    }

    mvArray[lines] = data;

    lines++;
}

while((fgets(c, 150, readingText) != NULL));

fclose(readingText);

}

Кажется, что операторы if работают хорошо и ловят именно ту строку, которую я хочу. Если я сделаю printf внутри оператора if, он поймает строку.

Но по какой-то причине я не могу правильно сохранить данные внутри массива структур.

Вне цикла do while, если я делаю

printf("%s", mvArray[1].name);

она выведет строку, поэтому она сохранила эту строку в правильном месте в массиве структур. Но это происходит только с первыми 2 переменными массива структур, только с именем и директором, поэтому я должен что-то упустить.

Большое спасибо и всего наилучшего.

EDIT:

Это текстовый файл, который я читаю.

Name: SomeMovie
Director: Someone
Release year: 1995
budget: 10000
Image: fasdf.jpg
Genre: Horror
Name: SomeMovie
Director: Someone
Release year: 1995
budget: 10000
Image: fasdf.jpg
Genre: Horror

Операторы if, похоже, хорошо улавливают информацию. Если я сделаю printf ("% s", c); внутри каждого оператора if будет распечатываться именно та строка, которую я хочу. Но я не могу хранить его внутри массива структур.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы, вероятно, хотите это:

#include <stdio.h>
#include <string.h>

int main() {

  struct movie {
    char name[30];
    char director[30];
    char yearOfRelease[30];
    char budget[30];
    char image[30];
    char genre[30];
  };

  struct movie mvArray[100];    
  struct movie data;

  FILE *readingText;
  readingText = fopen("movies.txt", "r");

  if (readingText == NULL)
  {
    printf("Can't open file\n");
    return 1;
  }

  char c[150];
  int lines = 0;

  while ((fgets(c, 150, readingText) != NULL))
  {
    fgets(c, 150, readingText);

    switch (lines % 6)
    {
    case 0:
      strcpy(data.name, c);
      break;

    case 1:
      strcpy(data.director, c);
      break;

    case 2:
      //... to be done...
      // probably strcpy(data.yearOfRelease, c);
      break;

    case 3:
      strcpy(data.budget, c);
      break;

    case 4:
      strcpy(data.image, c);
      break;

    case 5:
      strcpy(data.genre, c);
      break;
  }

    mvArray[lines] = data;
    lines++;
  }

  fclose(readingText);
}

Модификация:

  1. fgets вызывается только один раз за цикл в начале
  2. использует менее громоздкий switch/case вместо нескольких if s
  3. Случай 2 нуждается в лечении
  4. обработать случай, когда файл не может быть открыт
  5. struct movies переименован в struct movie (одна структура содержит один и только один фильм).

Есть еще возможности для дальнейшего совершенствования.

Например, вы можете скопировать непосредственно в mvArray, например, strcpy(mvArray[lines].genre, c); и полностью удалить переменную data.

Также lines должно быть line.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...