我有一个包含15列和1000多行值的文件。
45285785.00 45285797.00 45285776.00 45285795.00 45285785.00 45285803.00 45285769.00 45285773.00 45285771.00 45285795.00 45285771.00 45285798.00 45285796.00 45285797.00 45285753.00
35497405.00 35497437.00 35497423.00 35497465.00 35497463.00 35497468.00 35497437.00 35497481.00 35497417.00 35497479.00 35497469.00 35497454.00 35497442.00 35497467.00 35497482.00
46598490.00 46598483.00 46598460.00 46598505.00 46598481.00 46598480.00 46598477.00 46598485.00 46598494.00 46598478.00 46598482.00 46598495.00 46598491.00 46598491.00 46598476.00
我想读这个文件。我现在正在做的方法是采用15个变量然后将它们分别放入向量中。
double col1, col2, ... , col15;
vector <double> C1, C2, ..., C15;
ifstream input('file');
while(input >> col1 >> col2 >> ... >> col15)
{
C1.push_back(col1);
C2.push_back(col2);
...
C15.push_back(col15);
}
有更好的方法吗?我的意思是没有定义15个变量,在while循环中读取15列?
答案 0 :(得分:3)
是的,有。
您可以考虑所有cols的容器,例如vector<double> cols(15)
并使用向量向量替换C1, C2 ... C15
变量。然后你可以很容易地做到:
for(int i=0; i<cols.size(); ++i) {
input >> cols[i];
C[i].push_back(cols[i]);
}
但是在这种情况下,你不知道何时你停止阅读。要解决此问题,您可以使用input.eof()
或input.good()
方法,或尝试捕获fstream >>
运算符的返回值,就像在代码中一样。
答案 1 :(得分:0)
是的,有比现在更好的方式。
您需要声明double
类型的二维向量。
vector<vector<double> > C;
for(int i = 0; i < cols.size(); i++) {
input >> cols[i];
C[i].push_back(cols[i]);
}
答案 2 :(得分:0)
另一个&#34;向量或向量&#34;基于示例(在这种情况下......矢量数组)。
使用while
(这样您可以检查input >> val
结果)而不是for
#include <array>
#include <vector>
#include <fstream>
int main ()
{
double val;
std::array<std::vector<double>, 15> C;
std::ifstream input("file");
std::size_t ind { 0 };
while ( input >> val )
{
C[ind++].push_back(val);
if ( ind == C.size() )
ind = 0U;
}
if ( ind != 0U )
; // do something ?
return 0;
}