从混合数据文件读取将项目添加到字符串数组和二维int数组C ++

时间:2018-11-24 17:30:11

标签: c++ arrays

我有一个文本文件,如下所示:

    January 35 45 
    February 45 55 
    etc...

我正在尝试通读文件,并将每个月添加到字符串数组,然后将每个随后的整数添加到二维数组中。

我有一个months []数组和一个temps [] []数组。

我正在尝试类似

int size = 0;
while(!file.eof()) {
    file >> months[size];
    size++;
}

我不知道如何将两个整数加到int数组中...

这是一个类,令人惊讶,特别是要求从文件中读取数据,并将月份插入数组,然后将后面的两个整数插入二维数组。

我们还没有遍历结构或向量。

2 个答案:

答案 0 :(得分:2)

不要使用数组。具有结构的模型。

this.$apollo.mutate

接下来,添加一种输入结构的方法:

struct Month_Record
{
  std::string month_name;
  int         value_1;
  int         value_2;
};

您输入的内容将变为:

struct Month_Record
{
  //... same as above
  friend std::istream& operator>>(std::istream& input, Month_Record& mr);
}

std::istream& operator>>(std::istream& input, Month_Record& mr)
{
  input >> mr.month_name;
  input >> mr.value_1;
  input >> mr.value_2;
  return input;
}

您可以像访问数组一样访问数据库:

std::vector<Month_Record> database;
Month_Record mr;
while (input_file >> mr)
{
  database.push_back(mr);
}

该模型的一个不错的功能是您可以将记录放在一个缓存行中。对于并行阵列,处理器可能必须重新加载数据高速缓存以从其他阵列获取数据(因为可能必须将整个阵列加载到高速缓存中)。

答案 1 :(得分:0)

int size = 0;
while(size < MAX_ARRAY_LENGTH && // prevent overflow. 
                                 // Will stop here if out of space in array
                                 // otherwise && (logical AND) will require the following be true 
      file >> months[size] // read in month 
           >> temps[size][0] // read in first temp
           >> temps[size][1]) // read in second temp 
{ // if the month and both temperatures were successfully read, enter the loop
    size++;
}

MAX_ARRAY_LENGTH是一个常量,用于定义可以放置在数组中的最大月份数。

>>返回对正在读取的流的引用,因此您可以将操作链接在一起,并在读取完成后利用流的operator bool。如果流仍处于良好状态,则operator bool将返回true。

逻辑看起来像

loop
if array has room
    read all required data from stream
    if all data read
        increment size
        go to loop.

您可能需要在循环结束后进行测试,以确保已读取所有数据。如果您要读取文件的末尾,则类似if (file.eof())的文件将确保已读取整个文件。如果您希望获得一年的数据价值,请if (size == ONE_YEAR),其中ONE_YEAR是一个常数,用于定义一年中的月份数。