我已经学习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语句中,它将打印出我想要的确切行。但是我无法将其存储在结构数组中。
答案 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);
}
修改:
fgets
在开始时每个循环仅被调用一次switch/case
而不是多个if
struct movies
重命名为struct movie
(一个结构只包含一部电影,而只有一部电影)。仍有进一步改进的空间。
例如,您可以像这样mvArray
直接复制到strcpy(mvArray[lines].genre, c);
并将data
变量放在一起。
也lines
应该是line
。