我对c ++很新,所以请耐心等待。 我有一个由结构组成的向量。他们都在上课。我应该从文件中读取数据(工作正常)并保存。但是当我尝试在结构的任何部分输入信息时,我的程序崩溃了。
这是标题中的类:
class Content{
private:
string discName;
string discID;
struct content{
int number=1;
string name;
string type;
int size;
int track;
int sect;
}heck;
vector <content> block;
public:
Content();
void read_int(fstream& file);
void read_id(fstream& file);
void read_string(fstream&, int, string);
void read_type(fstream& file);
};
这是它使用的功能之一:
void Content::read_int(fstream& file){
int file_content;
file.read(reinterpret_cast<char*> (&file_content), 1);
this->block[0].track=file_content;
}
从我发现的情况来看,大多数人倾向于以相反的方式做到这一点,在结构中使用向量,是否更好?
答案 0 :(得分:1)
两种可能性(至少):
首先,向量已包含要使用从文件读取的值设置的元素,然后需要确保向量已包含元素。也许在Content
的构造函数中?类似于block.resize(n)
的内容,适用于某些适当的n
。
其次,向量最初不包含任何元素,并且您希望使用从文件读取的数据创建的元素填充它。类似的东西:
file.read(reinterpret_cast<char*> (&file_content), sizeof file_content); // read data from file
content c; // construct an element
c.track = file_content; // set data of the element
this->block.push_back( c ); // add that new element to the vector
请注意在文件中读取时给出适当的大小。看起来你试图读取一个int,所以要读取的字节数应该是存储int的字节数:sizeof int
。
还要注意,您对Content
的定义包含一个名为heck
的字段...我怀疑您需要什么。我怀疑struct content
只是向量中包含的类型的定义,因此以下更好:
struct content {
int number=1;
string name;
string type;
int size;
int track;
int sect;
};
class Content{
private:
string discName;
string discID;
vector <content> block;
public:
Content();
void read_int(fstream& file);
void read_id(fstream& file);
void read_string(fstream&, int, string);
void read_type(fstream& file);
};
请注意,类型标识符的首字母大写。那你可能有:
struct ContentData {
....
};
class Content {
....
vector<ContentData> block;
};
或类似的。
更好的选择是使用单个函数来读取返回int的int并且使用得恰当:
void Content::read_int(fstream& file){
int file_content;
file.read(&file_content, sizeof file_content); // take care of returned value!!!
return file_content;
}
Content c;
c.track = read_int(f);
c.size = read_int(f);
c.type = read_string(f);
c.name = read_string(f);
...
bloc.push_back( c );
答案 1 :(得分:0)
正如评论建议的那样,你编程可能崩溃,因为块中没有元素,所以block [0]会导致未定义的bahaviour。如果您使用的是C ++ 11标准,请尝试std::vector::emplace_back(),并希望在向量中为每个读取值添加新元素。或者如果由于某种原因总是希望它始终在第一位,那么在构造函数中初始化它或在函数中使用它:
void Content::read_int(fstream& file)
{
int file_content = file.get(); //no need for reintepret casting ;)
if (!block.empty())
this->block[0].track=file_content;
//possibly else to create the element if needed
}
为了解决你的第二个问题,在这个例子中没有“大多数人倾向于”或“更好的方式”。这是你想要达到的目标。结构中的向量与持有结构的向量不同。
在这里,你有一个包含元素的数组,其中每个元素包含4个int和2个字符串。如果你想在你的结构中创建向量,你就会为每个实例提供一个结构,包含4个整数,2个字符串和一个向量。