使用 C++ Code::Blocks 将文本文件中的单独部分读入矢量
read seperate parts from textfile into vector using C++ Code::Blocks
为了我的硕士论文,我需要用 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;
}
但我的结果当然是这样的。如果你看不到图片,我会为你描述。我认为在向量的每个位置,文本文件的整行都保存为一个字符串。但是我怎样才能访问 'winddata' 和 'wavedata' 这两个独立的部分呢?我希望写一些东西,将文本文件的每个单独部分放在向量中的单独位置,这样我就知道要访问哪些位置,然后获取我的风数据或波数据编号。但我真的不知道该怎么做..我试过这样的事情:
while (myfile)
{
// read stuff from the file into a string and print it
myfile>> dataVector;
}
但这当然行不通。我可以做这样的事情吗?只有我单独的文本片段之间的白色 space 被跳过并且这些片段位于向量中的新位置?
我真的希望有人能帮我解决这个问题。我感到完全迷失了。提前谢谢你。
您应该拆分从文件中获得的每一行,并访问您将返回的矢量的第三个 (WaveState) 和第四个 (WindState) 元素。这是一个关于如何拆分字符串的示例。
String Split
如果编译支持 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;
}
为了我的硕士论文,我需要用 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;
}
但我的结果当然是这样的。如果你看不到图片,我会为你描述。我认为在向量的每个位置,文本文件的整行都保存为一个字符串。但是我怎样才能访问 'winddata' 和 'wavedata' 这两个独立的部分呢?我希望写一些东西,将文本文件的每个单独部分放在向量中的单独位置,这样我就知道要访问哪些位置,然后获取我的风数据或波数据编号。但我真的不知道该怎么做..我试过这样的事情:
while (myfile)
{
// read stuff from the file into a string and print it
myfile>> dataVector;
}
但这当然行不通。我可以做这样的事情吗?只有我单独的文本片段之间的白色 space 被跳过并且这些片段位于向量中的新位置?
我真的希望有人能帮我解决这个问题。我感到完全迷失了。提前谢谢你。
您应该拆分从文件中获得的每一行,并访问您将返回的矢量的第三个 (WaveState) 和第四个 (WindState) 元素。这是一个关于如何拆分字符串的示例。
String Split
如果编译支持 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;
}