微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++ ifstream fail()标志打开但strerror()没有显示错误

如何解决c ++ ifstream fail()标志打开但strerror()没有显示错误

我有如下代码。我觉得文件流没有到达文件末尾,因为 ln_cnt 值不等于 QGIS 中显示的特征计数(即折线特征的数量)。

这种不等式发生在shapefile很大的时候,所以我无法一一统计特征,但我已经用小尺寸的shapefile进行了测试,我的代码运行良好。

polyline_class line_1;

int ln_cnt ++; // the counter for counting the lines that's read

ifstream reader("some_polyline.shp",ios::in | ios::binary);

while (!reader.eof()){

    shp_read_pnt(&reader,&line_1);
    ln_cnt ++;

}

cout << ".good() = " << reader.good() << "\n";
cout << ".bad() = " << reader.bad()   << "\n";
cout << ".fail() = " << reader.fail() << "\n";
cout << ".eof() = " << reader.eof()   << "\n";
cerr <<  "Error: " << strerror(errno);
reader.close();

结果是:

.good() = 0
.bad() = 0
.fail() = 1
.eof() = 1
Error: No error

真的有错误吗?

解决方法

TL;DR“好”不是“坏”的反义词,“好”是“失败”的反义词

iostreams 有两个1 持久状态位,用于记录之前对流的操作的结果。这两个位都是“粘性的”——它们开始为假,并在发生某些事情时设置为真,然后保持真,直到通过调用 clear() 明确清除它们

  • eof:设置是否由于到达文件尾而无法读取数据
  • bad:设置是否在底层设备上发生错误

eof() 和 bad() 函数检查这些位,fail() 函数检查它们(所以 fail() == eof() || bad())。 现在令人困惑的部分 -- good() 同时检查两者,所以好不是坏的反面。而是good() == !fail()

差不多就是这样,并解释了您所看到的结果。你读到文件末尾,所以 eof 位被设置,但从来没有任何错误,所以 bad 仍然清晰。您有 fail() == eof() || bad()good() == !fail(),正如人们所期望的那样。


1好吧,从技术上讲,以上是错误的—— 可能存储了更多的位(包括一个好的位和一个失败的位),但总体而言行为如上面所解释的——当设置了错误位或 eof 位时,将设置失败位,并且只有在其中之一设置时才会设置失败位。当设置失败位时,好位将始终被清除。事情变得与上述不一致的唯一方法是,如果用户手动将位设置为与 clear(some-odd-state) 的某种奇怪组合,但不清楚为什么有人会这样做。 clear() 设置的默认状态(仅)设置了好位。

,

没有真正安全的方法来判断,因为您显然没有发布所有代码(例如缺少 shp_read_pnt() 的实现),但无论如何我都会尝试:

std::ifstream 的读取操作(通常)根本不需要设置 errno。或者换句话说:std::ifstream 的读取操作之一失败并且仍然根本没有设置 errno 可能是完全合法的。

C++ 流通常使用异常或各种错误位(可以使用 fail()bad() 等查询)来表示出现问题。所以应该使用这些来代替 errno

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。