我有一个包含 4 列数据的文本文件 (data.txt)(第 1 列是时间,第 2、第 3 和第 4 列是特定数据),我想编写一个程序来提取它包含的通道之一,通过它的名字调用它,所以它创建一个只有 2 列的新文件(第一次,第二次提取的频道)。
命令行应该是 extract data.txt channel_2.txt
。
我是 C++ 的新手,我知道读/写的东西(ofstream/ifstream/stream),但我不确定我可以用这些创建一个新的 .txt 文件(具有不同的原始名称)类。
我开始写一些代码,它非常基础且不完整,但正如我所说,我没有 C++ 经验(所以请全面:))
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
int index
cout << "enter the index of the column to keep : " << endl;
cin >> index;
???
// open file for writing
string filename("data.txt");
ofstream file(filename._str());
if(file)
{
file << data << endl;
file.close();
}
else
{
cerr << "impossible to open file" << endl;
}
return 0;
}
这是 data.txt 文件的样子:
%MC_DataTool ASCII conversion
%
%t El 12 El 45 El 86
%[ms] [microV] [microV] [microV]
0.000 0.83 -4.58 3.75
0.100 -8.33 -2.08 2.50
0.200 -10.00 -0.42 0.83
0.300 -9.58 -3.75 -8.75
0.400 -2.50 -2.50 -5.00
0.500 -5.42 -2.92 -9.58
...
59999.800 -3.33 2.50 -2.50
59999.900 1.67 -1.25 -2.08
60000.000 -2.92 -0.42 -0.42
理想情况下,输出应该如我所解释的那样:
%time channel_2
0.000000 -4.580000
0.100000 -2.080000
0.200000 -0.420000
0.300000 -3.750000
...
非常欢迎任何帮助、评论或建议! 谢谢大家。
答案 0 :(得分:1)
这是一种方法:
std::vector<std::vector<double>> database;
typedef std::vector<double> DB_Row;
//...
double column1, column2, column3, column4;
while (file >> column1 >> column2 >> column3 >> column4)
{
DB_Row row;
row.push_back(column1);
row.push_back(column2);
row.push_back(column3);
row.push_back(column4);
database.push_back(row);
}
以上代码将您的数据作为矩阵或二维数组读入。
要访问第 4 行的第 2 列:
double value = database[3][1]; // Remember, 0 based indexing
编辑 1:访问所有行的第 2 列
提醒,第 2 列由索引值 1 表示(0 是第 1 列的索引)。
const unsigned int index_column_2 = 1;
const unsigned int ROW_COUNT = database.size();
for (unsigned int row = 0u; row < ROW_COUNT; ++row)
{
std::cout << "value at row: " << row
<< ", column 2: " << database[row][index_column_2]
<< "\n";
}