使用C ++ Code :: Blocks从文本文件中将单独的部分读入向量

时间:2015-03-12 18:26:44

标签: c++ vector inputstream

对于我的硕士论文,我需要用C ++编写程序,但我根本不是程序员。这也是我在C ++中的第一个程序,我曾经用Java编写学校程序。 我的问题如下。 我有这些包含一些数据的文本文件,如下所示: 万一你看不到图片:

index   date    month   WaveState   WindState
0   2015-01-01 00:00:00 1   9.0 8.0
1   2015-01-01 04:00:00 1   9.0 7.0
2   2015-01-01 08:00:00 1   9.0 8.0
3   2015-01-01 12:00:00 1   9.0 9.0
4   2015-01-01 16:00:00 1   9.0 8.0
5   2015-01-01 20:00:00 1   9.0 7.0
6   2015-01-02 00:00:00 1   9.0 4.0
7   2015-01-02 04:00:00 1   9.0 2.0
8   2015-01-02 08:00:00 1   9.0 1.0
9   2015-01-02 12:00:00 1   9.0 3.0
10  2015-01-02 16:00:00 1   9.0 4.0

等等。

现在我需要从这些文本文件中提取仅考虑'windstate'和'wavestate'的数字。我想将这些写入矢量,以便我可以在我的程序中轻松地使用它们。

这是我到目前为止编写的代码:

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

using namespace std;

vector <string> dataVector;

int main()
{

    string line;
    ifstream myfile("wm994.txt");

    if(myfile.is_open())
    {

        while (getline(myfile,line))
        {
            dataVector.push_back(line);
        }
        myfile.close();
    }
    else cout << "Woops, couldn't open file!" << endl;

    for (unsigned i = 0; i<dataVector.size(); i++)
    {
       cout << dataVector.at(i) << endl;
    }

    return 0;
}

但当然我的结果看起来像这样。万一你看不到图片我会为你描述。我认为在向量的每个位置,文本文件的整行都保存为String。但是,如何才能访问2个独立部分'winddata'和'wavedata'呢?我希望写一些东西,将文本文件的每个单独部分放在向量中的一个单独位置,这样我就知道要访问哪些位置然后获取我的winddata或wavedata数字。但我真的不知道该怎么做..我试过这样的事情:

while (myfile)
    {
        // read stuff from the file into a string and print it
        myfile>> dataVector;            
    }

但这当然不起作用。我可以这样做吗?只跳过我单独文本之间的空格,这些文章位于向量中的新位置?

我真的希望有人可以帮我解决这个问题。我觉得完全迷失了。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您应该从文件中分割每行,并访问您将返回的向量的第3个(WaveState)和第4个(WindState)元素。以下是有关如何拆分字符串的示例。

String Split

答案 1 :(得分:0)

如果您编译支持C ++ 11提供了使用正则表达式库的机会:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <regex>

int main()
{
    std::vector <std::pair<double,double>> dataVector;
    std::string line;
    std::ifstream myfile("1.txt");
    std::smatch m;
    std::regex e (".*(\\w+\\.\\w+) (\\w+\\.\\w+)$");

    if(myfile.is_open())
    {
        while (getline(myfile,line))
        {
            std::regex_search (line,m,e);
            dataVector.push_back(std::pair<double,double>(std::stod(m[1].str()),std::stod(m[2].str())));
        }
        myfile.close();
    }
    else 
    {
    std::cout << "Woops, couldn't open file!" << std::endl;
    return -1;
    }

    for (auto i:dataVector)
        std::cout<<i.first<<" "<<i.second<<std::endl;

    return 0;
}