C++;将数据从*.txt文件读取到结构的向量 我是C++的新手,对文件读写……/P>有一些误解。

C++;将数据从*.txt文件读取到结构的向量 我是C++的新手,对文件读写……/P>有一些误解。,c++,vector,struct,ifstream,ofstream,C++,Vector,Struct,Ifstream,Ofstream,我有一个.txt数据文件,其中包含有关街道的信息,即街道、房屋编号和公寓数量 我的任务是从文件中读取数据,添加新数据,删除不需要的数据,并计算某条街上的公寓数量 对于程序工作期间的数据存储,我制作了一个结构向量: struct homeAdressBook { std::string street; char homeNumber[255]; int flats; }; std::vector<homeAdressBook> HAB; .txt文件中的每一

我有一个.txt数据文件,其中包含有关街道的信息,即街道、房屋编号和公寓数量

我的任务是从文件中读取数据,添加新数据,删除不需要的数据,并计算某条街上的公寓数量

对于程序工作期间的数据存储,我制作了一个结构向量:

struct homeAdressBook {
    std::string street;
    char homeNumber[255];
    int flats;
};

std::vector<homeAdressBook> HAB;
.txt文件中的每一行都属于结构元素的[i]-s向量
我无法理解在程序工作期间如何正确地将.txt文件中的数据添加到我的结构向量中(街道名称最多可容纳5或6个单词,程序如何区分街道名称、住宅编号或公寓数量)

我建议您为您的结构重载
操作符>

struct homeAdressBook
{
    std::string column1;
    std::string street;
    std::string homeAddress;
    int flats;
    friend std::istream& operator>>(std::istream& input, homeAddressBook& address);
};

std::istream& operator>>(std::istream& input, homeAddressBook& address)
{
  input >> address.column1;
  input >> address.street;
  input >> address.homeAddress;
  input >> address.flats;
  return input;
}
上述内容将允许您将输入过程更改为:

std::vector<homeAddressBook> database;
homeAddressBook record;
//...
std::ifstream data_file("addresses.txt");
while (data_file >> record)
{
  database.push_back(record);
}
std::向量数据库;
家庭地址簿记录;
//...
std::ifstream数据_文件(“addresses.txt”);
while(数据文件>>记录)
{
数据库。推回(记录);
}
注释

  • 您的帖子描述了数据中的3列,但是您的数据源 显示4
  • 文档作为输出流(
    ostream
    )打开,然后使用 输出流上的
    getline
  • 您的结构名称有“book”,这意味着 项目。我建议使用诸如“Home\u Address”这样的名称来表示 单一项目。使用本书的
    std::vector
  • 编辑1:

    operator>
    中的成员前面加上“address.”。

    请花些时间阅读,谢谢您的回答!这很有帮助,我已经尝试过这样做:
    unsigned int I=0;while(document>>HAB[i].street>>HAB[i].homeNumber>>HAB[i].flats){HAB.push_back(homeAddressBook());i++;
    程序给出一个错误:Vector subscrip超出范围,但如果在读取过程中生成另一个string对象并保留数据,则我需要使用该字符串,而不是Vector structRead将其读入临时变量并推回循环中的Vector?我无法理解所有这些事情是如何发生的逻辑一个包含数据的文件,带有'document>>HAB[i].street'我给出了存储信息的方式,然后我将向量推回到结构元素的另一个向量,在那里存储另一种类型的数据…我错了吗?但是当你这样做时,循环的第一次迭代HAB将是空的,所有索引都将超出范围,并导致未定义的行为。Y你可以先把它推到循环外,然后在最后你会在向量中有一个未使用的元素。谢谢你的回答,托马斯!但是当我在代码中使用它时,你声明操作符重载,即“input>>column1;input>>street…”IDE诅咒我-column1,street,flat,homeNumber是未定义的。如果我加上like this:'database[i].column1'没有红线下划线,但我认为我需要声明'int i=0'并在增量'i'中添加'for()'循环……那么'ostream'中的'getline'呢?(您的注释#2)它从用户处获取行并将其附加到我的向量中,这样做是否错误?您可以在终止的
    }
    上方的
    结构中找到声明。我更正了
    操作符>
    的实现,请参阅我的最新编辑。顺便说一句,您可以通过在internet上搜索“c++读取文件结构空间分隔”来找到这种模式的示例。我没有使用
    std::getline
    ,因为它将整个记录读取为字符串。请记住,
    std::getline
    是一个输入函数,需要一个
    std::istream
    派生对象(例如,“i”前缀用于输入,例如
    ifstream
    )。
    std::getline
    不适用于输出流(例如流的
    )。字符串的
    运算符>>
    将读取字符,直到遇到空白。
    struct homeAdressBook
    {
        std::string column1;
        std::string street;
        std::string homeAddress;
        int flats;
        friend std::istream& operator>>(std::istream& input, homeAddressBook& address);
    };
    
    std::istream& operator>>(std::istream& input, homeAddressBook& address)
    {
      input >> address.column1;
      input >> address.street;
      input >> address.homeAddress;
      input >> address.flats;
      return input;
    }
    
    std::vector<homeAddressBook> database;
    homeAddressBook record;
    //...
    std::ifstream data_file("addresses.txt");
    while (data_file >> record)
    {
      database.push_back(record);
    }