Извлечь только несколько столбцов из файла .dat

Я должен сделать программу на С++ для моей диссертации, которая открывает и извлекает только два столбца из файла .dat, который выглядит так, с большим количеством строк:

0.000000 -9.833374 1.000000 0.156921 0.125478 0.350911
5.015625 -9.831743 1.000000 0.157021 0.125752 0.349945
10.015625 -9.838824 1.000000 0.157101 0.125566 0.351512

Мне удалось открыть и прочитать каждую строку с помощью команды getline(), но я понятия не имею, как извлечь только те столбцы, которые мне нужны (в частности, второй и четвертый). Я очень новичок в использовании этого языка программирования, поэтому может ли кто-нибудь дать мне примеры или указания, как выполнить эту задачу?

Большое спасибо


person Paolo Orsatti    schedule 09.11.2015    source источник
comment
См. раздел Разделить строку в C++? для примеров того, как можно извлечь значения из каждого линия.   -  person melak47    schedule 09.11.2015


Ответы (1)


Вы можете использовать stringstream для этого:

ifstream file("data.dat")
string line;

while (getline(file,line))
{
    istringstream ss(line);

    // possibly you will want some other types here.
    string col2;  
    string col4;

    ss >> col2;    // extracts 1st col.
    ss >> col2;    // extracts 2nd col.

    ss >> col4;    // extracts 3rd col.
    ss >> col4;    // extracts 4th col.

    // Now you can something with col2 and col4
    cout << col2 << " " << col4 << endl;

}

Обратите внимание, что сначала я извлекаю первый столбец в col2, а затем перезаписываю его вторым столбцом. Аналогично делаю для col4.

Конечно, вы можете использовать другие типы для col2 и col4, если это соответствует вашему файлу.

Кроме того, если вы не хотите читать в столбцах, просто чтобы потом их выбросить, взгляните на std::istream::ignore, который позволяет пропустить ввод.

person oo_miguel    schedule 09.11.2015
comment
Итак, используя этот синтаксис (col1 и col2), моя программа автоматически понимает, что я отношусь к первому и второму столбцу файла .dat? - person Paolo Orsatti; 09.11.2015
comment
@ПаолоОрсатти Нет! идентификаторы не имеют значения. Оператор >> будет просто читать в одном столбце при каждом вызове. поэтому вызов ss >> col; два раза будет считывать в первом столбце значение col, а затем во втором столбце — одну и ту же переменную (перезаписывая первый столбец, сохраненный ранее) - person oo_miguel; 09.11.2015
comment
Большое спасибо! Вы решили мою проблему, теперь я могу извлечь нужный столбец. - person Paolo Orsatti; 09.11.2015
comment
Теперь у меня другая проблема: мне нужно сравнить данные n-строки столбца с данными строки (n+1) того же столбца. Решения? - person Paolo Orsatti; 09.11.2015
comment
@PaoloOrsatti, пожалуйста. Решив эту проблему, вы должны создать новый вопрос для своей новой проблемы ;) - person oo_miguel; 09.11.2015