【问题标题】:Reading file line by line in C++ skipping some lines在C++中逐行读取文件跳过一些行
【发布时间】:2012-10-09 14:37:15
【问题描述】:

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

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;

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

【问题讨论】:

  • 考虑缩短您的示例,因为在阅读前几行后似乎会出现错误。
  • 两件小事:(1) 最好说 "discarding" 而不是 "skipping"有 以一种或另一种方式阅读它们(只需找到下一行的开头......); (2) 一旦你意识到你可能会问自己“我如何区分 cmets 和好东西,一旦我阅读了任何特定的行,我可以让这个过程自动化吗?”。。跨度>

标签: c++ string input getline


【解决方案1】:

当您执行例如correl&gt;&gt;C1; 时,换行符会留在流中,因此下一个getline 会获取该换行符,而接下来的correl&gt;&gt;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;

【讨论】:

  • 谢谢。我需要特殊声明才能使用“.ignore”功能吗?该命令存在哪个 stl lib?我收到错误“numeric_limits”未在此范围内声明。
  • @user1705329 ignorestd::basic_istream 类的一部分,因此不需要这样做。对于std::numeric_limits,您需要&lt;limits&gt; 头文件。
【解决方案2】:

以下更简单的代码应该可以解决问题:

#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);,或使用任何其他转换方法。)

【讨论】:

  • 对于奖励积分(阅读:赞成票),请解释 OP 做错了什么
  • @LightnessRacesinOrbit:过去我已经做过一百万次了;今晚不行 :-S 只要看看任何重复的我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2010-12-24
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多