c++ - 如何将文件中的数据存储到具有 vector 成员的结构 vector 中

标签 c++ file vector input struct

假设输入文件包含以下内容,每个都对应结构中的四个成员:
0 2 54 34

1 2 43 56

4 5 32 67

因此,例如,在输入文件的第一行中,我希望将 0 存储为 departmentStationId,将 2 存储为 arrivalStationId,将 54 存储为 departureTime,将 34 存储为 arrivalTime。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <list>
#include <vector>
#include <utility>
#include "graph.h"
using namespace std;


int main(int argc, char **argv)
{

  ifstream file;


  struct TrainsFile{ 
    vector<int> departureStationId;
    vector<int> arrivalStationId;
    vector<int> departureTime;
    vector<int> arrivalTime;
  };


  vector<TrainsFile> trains;//creating vector of structs here


  file.open(argv[1]);

  if (file.is_open())
 {
   //How does one use push_back() here given that I am dealing with vectors within vectors?
   while(!file.eof())
   {
    file >> departureStationId >> arrivalStationId >> departureTime >> 
    arrivalTime;
   }

 }
}

最佳答案

根据您规定的目标和样本数据文件,我认为您的方向不对。您似乎想要文件中的列车列表,而不是列车文件列表。这使得 TrainsFile 中的 vector 消失并消除了您的问题。

通过快速重命名我们得到的结构

struct Train
{
    int departureStationId;
    int arrivalStationId;
    int departureTime;
    int arrivalTime;
};

如果我们将文件的读取从

while(!file.eof())
{
    file >> departureStationId >> arrivalStationId >> departureTime >> arrivalTime;
}

operator>> 清洁度重载

std::istream &operator >>(std::istream & in, Train & train)
{
    return in >> train.departureStationId 
              >> train.arrivalStationId 
              >> train.departureTime 
              >> train.arrivalTime;
}

然后我们可以重写the faulty while loop

Train train;
while (file >> train)
{
    trains.push_back(train);
}

这将循环直到无法从文件中读取火车。

完全组装的例子:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

struct Train
{
    int departureStationId;
    int arrivalStationId;
    int departureTime;
    int arrivalTime;
};

std::istream &operator >>(std::istream & in, Train & train)
{
    return in >> train.departureStationId
              >> train.arrivalStationId
              >> train.departureTime
              >> train.arrivalTime;
}

int main(int argc, char **argv)
{

    ifstream file;

    vector<Train> trains; //creating vector of structs here

    // strongly recommend testing argc to make sure there ID an argv[1] here
    file.open(argv[1]);

    if (file.is_open())
    {
        Train train;
        while (file >> train)
        {
            trains.push_back(train);
        }
    }
}

由于每条线路似乎只有一列火车,对此的改进将是 to use std::getline从文件中提取一行,然后 use a std::istringstream从线路中提取火车。这将使您能够更好地检测格式错误的文件并从中恢复。参见 Read file line by line using ifstream in C++用于演示此方法。

关于c++ - 如何将文件中的数据存储到具有 vector 成员的结构 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547133/

相关文章:

c++ - IHttpRequest 响应长度限制

c++ - 如何从顶点着色器中的 vec3 获取值? OpenGL 3.3

c# - 如何将多个字节数组组合成一个以创建文件

C++读取大量文件的一小部分

C# Vector<double>.CopyTo 比非 SIMD 版本快多少?

c# - C# 中的矢量投影/拒绝?

c++ - 如何让柯南生成 FindXXX.cmake?

c++ - VC++调试: is it possible to skip cursor?

c++ - 重载提取运算符

c++ - 将对象存储在 vector 中, vector 在 C++ 中的映射中