我想使用fstream从txt文件读入结构。 我以下面显示的方式将数据保存到文件中: 为了阅读数据,我尝试了一些与getlines或tabsin相关的厚颜无耻的东西<
struct tab{
int type,use;
string name, brand;
};
tab tabs[500];
ofstream tabsout;
tabsout.open("tab.txt", ios::out);
for (int i = 0; i < 500; i++){
if (tabs[i].use==1){
tabsout << tabs[i].type << " " << tabs[i].name << " " << tabs[i].brand << "\n";
}
}
tabsout.close();
//输入失败的部分:(
int i=0;
ifstream tabsin;
tabsin.open("tab.txt", ios::in);
if (tabsin.is_open()){
while(tabsin.eof() == false)
{
tabsin >> tabs[i].type>>tabs[i].name>>tabs[i].brand;
i++
}
tabsin.close();
答案 0 :(得分:3)
您通常希望为类/结构重载operator>>
和operator<<
,并将读/写代码放在那里:
struct tab{
int type,use;
string name, brand;
friend std::istream &operator>>(std::istream &is, tab &t) {
return is >> t.type >> t.name >> t.brand;
}
friend std::ostream &operator<<(std::ostream &os, tab const &t) {
return os << t.type << " " << t.name << " " << t.brand;
}
};
然后你可以在一个文件中读取如下文件:
std::ifstream tabsin("tab.txt");
std::vector<tab> tabs{std::istream_iterator<tab>(tabsin),
std::istream_iterator<tab>()};
....并写出像:
这样的对象for (auto const &t : tabs)
tabsout << t << "\n";
请注意(就像任何理智的C ++程序员一样)我使用vector
而不是数组,(除其他外)允许存储任意数量的项目,并自动跟踪实际存储的数量
答案 1 :(得分:1)
对于初学者来说,不使用.eof()
来控制你的循环:它不起作用。相反,请在阅读后使用流的状态:
int type;
std::string name, brand;
while (in >> type >> name >> brand) {
tabs.push_back(tab(type, name, brand));
}
如果您的name
或brand
包含空格,则上述操作无效,您需要编写一种格式,您可以知道何时相应地停止abd读取,例如使用{{1 }}
您也可以考虑将逻辑包装为由合适的运算符读取或写入对象。
答案 2 :(得分:0)
istream& getline (istream& is, string& str, char delim);
看一下第三个参数,你可以使用 std :: getline 来解析你的行。但这绝对不是序列化对象的最佳方式。您应该使用字节流,而不是使用文本文件。