Проблема заключается в данных в редактировании текстового файла. Текстовый файл содержит пять столбцов.
1 | 2 | 3 | 4 | 5 |
1 2 4 4 1
2 3 4 4 3
3 4 5 0 0
Целью было бы перемещение в столбцах 4 и 5 (значения> 0) в столбцах 1 и 2 выше или для отслеживания:
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
?
Это было бы очень признательно.
Я согласен с Иоакимом. Кроме того, используйте 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;
}
Имейте вектор векторов. Для каждой строки прочитайте каждое число в под-вектор. Затем выпишите три первых значения каждого подвектора, за которыми следуют последние два значения каждого подвектора.