gpt4 book ai didi

c++ - 使用istream_iterator时如何忽略最后的空白行

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:52 25 4
gpt4 key购买 nike

假设我有一个像这样的二维点的简单文本文件:

10
0.000 0.010
0.000 0.260
0.000 0.510
0.000 0.760
0.000 1.010
0.000 1.260
0.000 1.510
0.000 1.760
0.000 2.010
0.000 2.260
// Blank line here

我为 IO 使用了一个简单的结构:

template <typename T>
struct point
{
point (T x = 0, T y = 0) : x (x), y (y) {}

T x ;
T y ;

friend std::istream& operator>> (std::istream &is, point &p) {
is >> p.x >> p.y ;
return is ;
}
};

我的原始代码是:

int main (void)
{
std::string strFile = "Points.txt" ;

std::ifstream file ;
file.exceptions (std::ios::failbit | std::ios::badbit) ;
std::vector <point <double> > vec ;

try {
file.open (strFile) ;

int nPoints = 0 ;
file >> nPoints ;

for (int n = 0; n < nPoints; ++n) {
point <double> p ;
file >> p ;
vec.push_back (p) ;
}
}

catch (std::ios_base::failure &e) {
std::cerr << e.what () << "\n" ;
return 1 ;
}

return 0 ;
}

这很好用,但本着 no raw loops 的精神, 我想去掉 for 循环。

这是我的新代码:

int main (void)
{
std::string strFile = "Points.txt" ;

std::ifstream file ;
file.exceptions (std::ios::failbit | std::ios::badbit) ;
std::vector <point <double> > vec ;

try {
file.open (strFile) ;

int nPoints = 0 ;
file >> nPoints ;

std::copy (
std::istream_iterator <point <double> > (file),
std::istream_iterator <point <double> > (),
std::back_inserter (vec)
) ;
}

catch (std::ios_base::failure &e) {
std::cerr << e.what () << "\n" ;
return 1 ;
}

return 0 ;
}

一切都被很好地复制了,但不幸的是,读取最后的空白行会导致设置失败位。

我能想到的解决这个问题的唯一方法有点丑陋。我可以:

  • point::operator>>() 函数中放置一个 try-catch 子句
  • 检查已存在的 catch 子句中的 vec.size()

是否有一种优雅的方式来忽略最后的空行?

最佳答案

改变

    std::copy (
std::istream_iterator <point <double> > (file),
std::istream_iterator <point <double> > (),
std::back_inserter (vec)
) ;

    std::copy_n (
std::istream_iterator <point <double> > (file),
nPoints,
std::back_inserter (vec)
) ;

关于c++ - 使用istream_iterator时如何忽略最后的空白行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com