从文件读入结构

时间:2013-12-06 20:52:45

标签: c++ structure fstream

我想使用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();

3 个答案:

答案 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));
}

如果您的namebrand包含空格,则上述操作无效,您需要编写一种格式,您可以知道何时相应地停止abd读取,例如使用{{1 }}

您也可以考虑将逻辑包装为由合适的运算符读取或写入对象。

答案 2 :(得分:0)

istream& getline (istream&  is, string& str, char delim);

看一下第三个参数,你可以使用 std :: getline 来解析你的行。但这绝对不是序列化对象的最佳方式。您应该使用字节流,而不是使用文本文件。