【问题标题】:Reading data from a file into multiple arrays in C++将文件中的数据读取到 C++ 中的多个数组中
【发布时间】:2013-11-12 09:52:03
【问题描述】:

我正在处理一个需要从文件中获取输入的项目。我想读取数据,使输入文件的第一列进入第一个数组,第二列进入第二个数组,依此类推。

输入文件有 3 列,分别为 string、int 和 double 类型。

所以我需要 3 个字符串类型的数组,int 和 double。如何从文件中读取数据,以便每个数组获取其各自的数据?

谢谢。

【问题讨论】:

  • 尝试使用像 sqlite.org 这样的 SQL 解决方案来实现您的程序,这将是一个更可靠的解决方案,具有更好、更简单的方法。

标签: c++


【解决方案1】:

这里是你需要的代码

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

vector<int> arr1;
vector<string> arr2;
vector<double> arr3;


int main()
{
    int i;
    string str;
    double d;
    ifstream fin("myfile.txt");
    if (fin.is_open())
    {
        while (!fin.eof())
        {
            fin >> i >> str >> d;
            fin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            arr1.push_back(i);
            arr2.push_back(str);
            arr3.push_back(d);
        }
    }

    return 0;
}

【讨论】:

  • 真正不安全的代码,如果文件中给定行中的字符串仅包含一个空格,则此代码将失败。
  • 这不好,因为您检查 EOF 太晚了。您需要在推回向量之前验证输入。
  • @CashCow:正如我上面提到的,输入文件必须与预期的一样准确。在推回向量之前,我可以添加更多代码来验证值,但我认为这是开销。关于你的句子“检查 EOF 太晚了”,你能解释一下吗?
  • @user2485710:我认为输入必须清楚。字符串中不应有空格。当然,代码会失败。在这种情况下,必须将整行读取到一个临时字符串并从中提取值。
【解决方案2】:

类似:

while ( i < MAX_SIZE && myFile >> stringArray[i] >> intArray[i] >> doubleArray[i] )
  i++;

【讨论】:

    【解决方案3】:

    您需要在推回向量之前验证您的流式传输是否正确,为此,我将在将任何值推入任何向量之前检查所有正确流式传输的值,因此所有向量最终将具有相同的长度。

    std::vector< string > column1;
    std::vector< int> column2;
    std::vector< double > column3;
    
    do
    {
       // ifs is an open stream
        std::string temp1;
        int temp2;
        double temp3; 
        ifs >> temp1 >> temp2 >> temp3;
        if( ifs )
        {
            column1.push_back( temp1 );
            column2.push_back( temp2 );
            column3.push_back( temp3 );
        }
    }
    while( ifs );
    

    这只是一个“粗略”的例子。它假定字符串是一个单词。如果不是,您需要知道如何确定该列的结束位置,并正确阅读。

    为这 3 个值创建一个结构体,并将读取从文件到结构体,以及从结构体到向量的移动分开可能更容易。

    显然您会知道文件的格式。如果您将一行读入字符串,然后使用正则表达式解析字符串,这可能是将其拆分为 3 个组成部分的更好方法,特别是知道“字符串”部分的结束位置。也许您的字符串存储在引号内的文件中。

    也许您的列是制表符分隔的,在这种情况下,您将字符串读取到制表符为止。

    std::getline( ifs, temp1, '\t' );
    

    如果您可以控制文件的实际存储方式,这可能是最简单的实现方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多