错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
error: request for member which is of non-class type 'MULTIMEDIA_FILME [500]'|
所以程序的主要目标是构建一个文件并保存我将输入的数据。
我用 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);
}
该程序有两个问题:
-
该程序声明了 500 个电影对象。 这意味着当您要访问对象时,应在成员之前提供下标,例如
filmes.nome[1]
应该是
filmes[1].nome
-
无需声明 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);
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 我们可以访问一个不存在的联盟的成员吗