用C读取文件并将内容复制到结构数组

时间:2018-11-06 10:56:02

标签: c arrays structure

我已经学习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语句似乎可以很好地工作并捕获我想要的确切行。如果我在if语句中执行printf,它将抓住这一行。

但是由于某些原因,我无法在结构数组中正确保存数据。

在do while循环之外,如果我这样做

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

它将打印出该行,因此将其保存到结构数组中的正确位置。但这只对结构数组的前2个变量起作用,仅对名称和Director起作用,所以我一定缺少一些东西。

非常感谢您。

编辑:

这是我正在阅读的文本文件。

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 :(得分:3)

您可能想要这样:

#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
  3. 情况2需要治疗
  4. 处理无法打开文件的情况
  5. struct movies重命名为struct movie(一个结构只包含一部电影,而只有一部电影)。

仍有进一步改进的空间。

例如,您可以像这样mvArray直接复制到strcpy(mvArray[lines].genre, c);并将data变量放在一起。

lines应该是line