错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|

error: request for member which is of non-class type 'MULTIMEDIA_FILME [500]'|

本文关键字:FILME 成员 MULTIMEDIA 请求 类型 错误      更新时间:2023-10-16

所以程序的主要目标是构建一个文件并保存我将输入的数据。

我用 char做了这个并且工作得很好,但我也想用字符串做,所以我尝试了我用 char 做的方式,它给了我一些错误

错误:请求"电影"中的成员"nome",其非类类型为"MULTIMEDIA_FILME [500]"|

并且每个字符串都相同。

我尝试删除每个字符串中的 [500] 和 [1],它可以工作,但我想为同一个结构添加和保存各种数据,例如:

Nome: "some name"
Tipo: "some type of movie"
Ano: "some year"
Descricao: "some description"
....

并在我进行其他输入后重复它。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct MULTIMEDIA_FILME
{
string nome;
string tipo;
int ano;
string  descricao;
};
int main()
{
using namespace std;
struct MULTIMEDIA_FILME filmes [500] ;
fstream myFile("filme.txt", ios::in | ios::out | ios::app);
ofstream filme_txt;
filme_txt.open("filme.txt");
cout << "Nome do filme:" << endl;
cin >> filmes.nome[1];
filme_txt << filmes.nome[1] << endl;
cout << "Tipo do filme:" << endl;
cin >> filmes.tipo[1];
filme_txt << filmes.tipo[1] << endl;
cout << "Ano do filme:" << endl;
cin >> filmes.ano[1];
filme_txt << filmes.ano[1] << endl;
cout << "Descricao do filme:" << endl;
cin >> filmes.descricao[1];
filme_txt << filmes.descricao[1] << endl;
filme_txt.close();
}

编辑1:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct MULTIMEDIA_FILME
{
string nome;
string tipo;
int ano;
string  descricao;
};
int main()
{
int n_filmes=0,contador,i=0;
struct MULTIMEDIA_FILME filmes [500] ;
FILE *ficheiro_num_filmes;
ficheiro_num_filmes=fopen("num_filmes.txt","rb");
if(ficheiro_num_filmes==NULL)
{
ficheiro_num_filmes=fopen("num_filmes.txt","wb");
fwrite(&n_filmes,sizeof(int),1,ficheiro_num_filmes);
fclose(ficheiro_num_filmes);
}
else
{
fread(&n_filmes,sizeof(int),1,ficheiro_num_filmes);
fclose(ficheiro_num_filmes);
}
fstream myFile("filme.txt", ios::in | ios::out | ios::ate | ios::app);
ofstream filme_txt;
filme_txt.open("filme.txt");
cout << "Quanto filmes deseja gravar:" << endl;
cin >> contador;
cout << "Nome do filme:" << filmes[1].nome << endl;
do{
cout << "Nome do filme:" << n_filmes+1 << endl;
cin >> filmes[1+n_filmes].nome;
filme_txt << filmes[1+n_filmes].nome << endl;
cout << "Tipo do filme:" << endl;
cin >> filmes[1+n_filmes].tipo;
filme_txt << filmes[1+n_filmes].tipo << endl;
cout << "Ano do filme:" << endl;
cin >> filmes[1+n_filmes].ano;
filme_txt << filmes[1+n_filmes].ano << endl;
cout << "Descricao do filme:" << endl;
cin >> filmes[1+n_filmes].descricao;
filme_txt << filmes[1+n_filmes].descricao << endl;
n_filmes ++;
i++;
}while(i<contador);
filme_txt.close();
ficheiro_num_filmes=fopen("num_filmes.txt","w+b");
fwrite(&n_filmes,sizeof(int),1,ficheiro_num_filmes);
fclose(ficheiro_num_filmes);


}

该程序有两个问题:

  1. 该程序声明了 500 个电影对象。 这意味着当您要访问对象时,应在成员之前提供下标,例如

    filmes.nome[1]
    

    应该是

    filmes[1].nome
    
  2. 无需声明 500 个对象。 除非需要创建 500 个不同的文件,或者能够存储 500 个不同的电影对象,否则只需要创建一个电影对象。 因此,该程序的简化版本将是:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    struct MULTIMEDIA_FILME {
    string nome;
    string tipo;
    int ano;
    string descricao;
    };
    int main() {
    struct MULTIMEDIA_FILME filmes;
    fstream myFile("filme.txt", ios::in | ios::out | ios::app);
    ofstream filme_txt;
    filme_txt.open("filme.txt");
    cout << "Nome do filme:" << endl;
    cin >> filmes.nome;
    filme_txt << filmes.nome << endl;
    cout << "Tipo do filme:" << endl;
    cin >> filmes.tipo;
    filme_txt << filmes.tipo << endl;
    cout << "Ano do filme:" << endl;
    cin >> filmes.ano;
    filme_txt << filmes.ano << endl;
    cout << "Descricao do filme:" << endl;
    cin >> filmes.descricao;
    filme_txt << filmes.descricao << endl;
    filme_txt.close();
    }
    

如果你真的希望看到 500 部电影存储在一个文件中,那么你需要添加某种 while(( 循环来查询多达 500 次的电影对象。 由于您的要求没有要求这样做,并且由于您的程序中没有循环,因此我没有尝试调试问题的这个分支。

下面是带有 for 循环的更新代码,以响应您的注释。 可以做更多的工作。 对于何时要覆盖文件、何时要追加以及何时要读回文件的内容,要求并不明确。 我怀疑这些是稍后会提出的额外要求。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Multimedia_Filme {
string nome;
string tipo;
int ano;
string descricao;
};
int GetFilmCountFromFile(const string &fileName) {
ifstream myFile;
myFile.open(fileName);
if (myFile.is_open()) {
string line;
getline(myFile, line);
return stoi(line);  // convert string to int
} else {
return 0;
}
}
void WriteFileCountToFile(const string &fileName, int fileCount) {
ofstream myFile;
myFile.open(fileName);
if(myFile.is_open()) {
myFile << fileCount << endl;
myFile.close();
}
}
int GetIntFromUser(string prompt) {
int count;
cout << prompt << endl;
cin.clear();
cin >> count;
return count;
}
string GetStringFromUser(string prompt) {
string returnString;
cout << prompt << endl;
cin.clear();
cin.ignore(1);
cin >> returnString;
return returnString;
}
int main(int argc, char **argv) {
int n_filmes = 0, contador, i = 0;
Multimedia_Filme filmes[500];
n_filmes = GetFilmCountFromFile("filmCountFile.txt");
contador = GetIntFromUser("Quanto filmes deseja gravar: ");

ofstream filmeFile;
filmeFile.open("filme.txt");
if(filmeFile.is_open()) {
for (int i = 0; i < contador; i++) {
filmes[i].nome = GetStringFromUser("Nome do filme: ");
filmes[i].tipo = GetStringFromUser("Tipo do filme: ");
filmes[i].ano = GetIntFromUser("Ano do filme: ");
filmes[i].descricao = GetStringFromUser("Descricao do filme: ");
filmeFile << filmes[i].nome << endl
<< filmes[i].tipo << endl
<< filmes[i].ano << endl
<< filmes[i].descricao << endl;
}
filmeFile.close();
}
WriteFileCountToFile("num_filmes.txt", contador);
}