在C ++中逐行读取文件跳过一些行

时间:2012-10-19 02:19:36

标签: c++ string input getline

我有以下类型的输入文本文件

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;

第一个值是读取,而不是其他值。如何仅读取值并跳过输入文件中的注释?

2 个答案:

答案 0 :(得分: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;
}

(如果要将该行解析为数字,可以在C ++ 11中使用double d = std::stod(l1);,或使用任何其他转换方法。)

答案 1 :(得分: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;