6

如果有人问过这个问题,我很抱歉,但我似乎找不到对我有帮助的解决方案。我正在尝试从文本文件中读取数据,并最终将其存储在一个对象中。

文本文件有 4 个变量,全部用逗号分隔。

我试图这样做如下:

string v1, v2, v3, v4;
ifstream afile;
afile.open("thefile.txt");
afile >> v1 >> v2 >> v3 >> v4;
afile.close();
cout << v1 << endl;
cout << v2 << endl;
cout << v3 << endl;
cout << v4 << endl;

该文件有多个记录。我现在尝试只做 1 以确保它有效,但是当它读取数据时,它不会以逗号分隔。

从那里,我想将数据存储到一个对象中。以下工作是否有效: Thing* thing1 = new Thing(v1, v2, v3, v4);

虽然,当我读到 5 条记录时,构造上述代码行的最佳方法是什么?由于每个对象都需要一个唯一的名称,有没有一种方法可以使用 for 循环和向量进行迭代?ie for (int i = 0; i < 5; i++) { // 读入数据 // 存入向量 }

非常感谢任何提示

4

3 回答 3

8

CSV 格式比逗号分隔符更复杂。它可以包含引号,您应该相应地转义和解释,并且可能允许使用不同的分隔符。如果您的输入文件没有严格格式化,您真的应该使用专用的 CSV 导入/导出库。

分词器类可能会回答您的问题(例如来自boost的问题或更简单的问题可用)。

您应该检查有关此主题的其他 问题。

于 2012-09-02T05:50:55.120 回答
6

如果可以,请注意@Soravux 的回答并使用专门的库。特别是,他建议的 strtk 工具包似乎很有趣,并且只是一个标头。Boost 也可以通过至少 5 种不同的方式来实现,如果你打算使用 C++ 一段时间,它是一个值得学习的库。也就是说,所有这些解决方案都会给你的程序增加一些复杂性,而且你很可能想把这些精力花在其他地方,特别是如果你只需要一个非常简单的数字阅读器。以下是如何使用标准 C++(使用 STL,例如向量和流):

    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <algorithm>
    #include <vector>

    using namespace std;

    vector<double> &split(const string &s, 
        char delim, vector<double> &elems) 
    {
        stringstream ss(s);
        string item;
        while (std::getline(ss, item, delim)) {
            stringstream conv( item );
            double number;
            conv >> number;
            elems.push_back(number);
        }
        return elems;
    }

    struct my_record_t{
        double f1, f2, f3, f4;
    };

    typedef vector<my_record_t> my_record_vector_t;

    int main( int argc, char* argv[])
    {
        stringstream  in("10,20,2.0,5\n"
                          "4.,5.,6.,80\n"
                          "4.,2.,6.,70\n"
                          "4.,5.,6.,86\n"
                          "2.,5.,9.,80\n");
        // Or alternatively, :
        //    ifstream in("myfile.csv");

        // Here you store your records
        my_record_vector_t mrv;

        string line;
        vector< double > numbers; 
        while( std::getline( in, line, '\n' ) )
        {
            numbers.clear();
            split( line, ',', numbers);
            my_record_t r;
            r.f1 = numbers[0];
            r.f2 = numbers[1];
            r.f3 = numbers[2];
            r.f4 = numbers[3];
            mrv.push_back( r );
        }

        cout << mrv.size() << " records read" << endl;


        return 0;
    }

也许有点太长了,但它可以节省你的一天。

于 2012-09-02T06:08:56.107 回答
4

我会看看使用 ifstream 来读取浮点数并从解析逗号开始。CSV 格式更复杂,但该示例应该可以帮助您入门。该示例使用字符串工具包,它非常擅长解析文本并转换为您需要的结构元素。

于 2015-07-27T15:14:12.730 回答