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

Reading a file in C and copying the contents to an array of structures

我已经学了几个星期的 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 个变量执行此操作,仅对名称和导演执行此操作,所以我一定遗漏了一些东西。

非常感谢和亲切的问候。

编辑:

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

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 语句中,它会打印出我想要的确切行。但是我无法将它存储在结构数组中。

你可能想要这个:

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

还有进一步提升的空间

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

另外 lines 应该是 line.