string — чтение файла построчно в C ++, пропуская несколько строк

У меня есть следующий тип входного текстового файла

28306.5934893134
Const for C
0.086628745225
Const for D
1226.12828874073
Const for F
6.60731462829
Const for G
-14694.9395750279
Const for J
273245702.243239
Const for K
5563100.12791444

Я хочу читать построчно. В настоящее время я использую ifstream и getline, которые выглядят так:

correl>>const_h;
cout<<const_h;std::getline(correl,line_avoid);
correl>>C1;
cout<<C1<<endl;std::getline(correl,line_avoid);
correl>>C2;
cout<<C2<<endl;

std::getline(correl,line_avoid);
correl>>C3;
cout<<C3<<endl;

std::getline(correl,line_avoid);
correl>>C4;
cout<<C4<<endl;

std::getline(correl,line_avoid);
correl>>C5;
cout<<C5<<endl;

std::getline(correl,line_avoid);
correl>>C6;
cout<<C6<<endl;

Первое значение читается, но не остальные. Как мне прочитать только значения и пропустить комментарии во входном файле?

1

Решение

Когда вы делаете, например, correl>>C1; новая строка остается в потоке, поэтому следующий getline получает эту новую строку и следующее correl>>C2; пытается извлечь из строки, которую вы хотите игнорировать.

Есть несколько способов решить эту проблему. Первый заключается в использовании getline для обеих строк игнорируйте строку, которую хотите игнорировать, и используйте istringstream для другого, чтобы извлечь значение:

std::istringstream is;

std::getline(correl, line_avoid);
std::getline(correl, line_keep);
is.str(line_keep);
is >> C1;
cout << C1 << endl;

Другой способ — перейти на новую строку после прочтения значения:

std::getline(correl, line_avoid);
correl >> C1;
correl.ignore(numeric_limits<streamsize>::max(), '\n');
cout << C1 << endl;
1

Другие решения

Следующий, более простой код должен сделать свое дело:

#include <string>
#include <fstream>
#include <iostream>

std::ifstream infile("data.txt");

for (std::string l1, l2; std::getline(infile, l1) && std::getline(infile, l2); )
{
std::cout << "Data: " << l1 << std::endl;
}

(Если вы хотите разобрать строку как число, вы можете использовать double d = std::stod(l1); в C ++ 11, или используйте любой другой метод преобразования.)

1

По вопросам рекламы [email protected]