C ++ Редактирование текстового файла

0

Проблема заключается в данных в редактировании текстового файла. Текстовый файл содержит пять столбцов.

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?

Это было бы очень признательно.

Теги:
file
edit
text-files

2 ответа

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;
}
0

Имейте вектор векторов. Для каждой строки прочитайте каждое число в под-вектор. Затем выпишите три первых значения каждого подвектора, за которыми следуют последние два значения каждого подвектора.

  • 0
    Я должен узнать больше о векторах, можете ли вы привести пример? Это было бы очень мило.
  • 0
    Вы можете начать здесь codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню