C ++编辑文本文件

时间:2013-10-07 13:48:44

标签: c++ file text-files edit

问题是文本文件编辑中的数据。文本文件包含五列。

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

执行此操作

非常感谢。

2 个答案:

答案 0 :(得分:2)

我同意约阿希姆。此外,使用back_inserteristream_iteratorstringstream可让您在阅读文件时更轻松:

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。您需要加入sstreamalgorithmiteratoriosrteamfstreamstringvector

现在,您可以使用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)

有一个矢量矢量。对于每一行,将每个数字读入子向量。然后写出每个子矢量的三个第一个值,然后是每个子矢量的最后两个值。