从文件读入结构 [英] Read in from file into structure

查看:68
本文介绍了从文件读入结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用fstream从txt文件读入结构. 我将数据保存到文件中,如下所示: 为了读取数据,我尝试了一些带有getline或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();

解决方案

您通常想重载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而不是数组来(除其他事项外)允许存储任意数量的项目,并自动跟踪实际存储的数量. /p>

I want to read in from txt file into structure using fstream. I save the data to the file in the way shown below: To read the data i tried some cheeky stuff with getlines or 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();

//input part that fails me :(

    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();

解决方案

You usually want to overload operator>> and operator<< for the class/struct, and put the reading/writing code there:

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;
    }
};

Then you can read in a file of objects like:

std::ifstream tabsin("tab.txt");
std::vector<tab> tabs{std::istream_iterator<tab>(tabsin), 
                      std::istream_iterator<tab>()};

....and write out the objects like:

for (auto const &t : tabs) 
    tabsout << t << "\n";

Note that (like any sane C++ programmer) I've used a vector instead of an array, to (among other things) allow storing an arbitrary number of items, and automatically track how many are actually being stored.

这篇关于从文件读入结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆