问题是文本文件编辑中的数据。文本文件包含五列。
1 | 2 | 3 | 4 | 5 |
1 2 4 4 1
2 3 4 4 3
3 4 5 0 0
目标是在上面的第1列和第2列中移动第4列和第5列(值> 0)或跟进:
1 | 2 | 3 | 4 | 5 |
1 2 4 0 0
2 3 4 0 0
3 4 5 0 0
4 1 0 0 0
4 3 0 0 0
如何实现这一目标?有人可以告诉我如何使用C ++ std::vector
?
非常感谢。
答案 0 :(得分:2)
我同意约阿希姆。此外,使用back_inserter
,istream_iterator
和stringstream
可让您在阅读文件时更轻松:
vector<vector<double> > contents;
/* read file */
{
ifstream inFile( "data.txt" );
for ( string line; inFile; getline( inFile, line ) ) {
stringstream line_stream( line );
vector<double> row;
copy( istream_iterator<double>( line_stream ), istream_iterator<double>(),
back_inserter(row) );
contents.push_back( row );
}
}
这会将整个文件读入contents
。您需要加入sstream
,algorithm
,iterator
,iosrteam
,fstream
,string
和vector
。
现在,您可以使用for
循环轻松处理文件,并使用contents[i][j]
访问这些数字。如果我理解正确,这就是我想你想做的事情:
/* process file */
unsigned int n = contents.size();
for ( unsigned int i=0; i < n; ++i ) {
vector<double> row( 5, 0. );
bool add_row = false;
if ( contents[i].size() >= 5 ) {
for ( unsigned int j=3; j<4; ++j ) {
double value = contents[i][j];
contents[i][j] = 0.;
if ( value > 0 ) {
add_row = true;
row[j-3] = value;
}
}
if ( add_row == true ) {
contents.push_back( row );
}
}
}
现在将文件写入stdout,只需:
/* write file */
for ( unsigned int i=0; i < contents.size(); ++i ) {
copy( contents[i].begin(), contents[i].end(), ostream_iterator<double>( cout, " " ) );
cout << endl;
}
答案 1 :(得分:0)
有一个矢量矢量。对于每一行,将每个数字读入子向量。然后写出每个子矢量的三个第一个值,然后是每个子矢量的最后两个值。