当 seekg 查找文件末尾时未设置故障位 (C++,Linux)
failbit not being set when seekg seeks past end of file (C++,Linux)
我看到了我认为是istream::seekg的奇怪行为。 具体来说,它似乎当我寻求明显偏离文件末尾的点时,不要设置故障位。
从我在文档中可以看出,应该设置故障位,但事实并非如此。
谁能解释这种行为? 相关代码片段:
class Tester
{
...
void testTriggered()
{
fs.open("/pathtofile/testFile.TEST", std::ios_base::in|std::ios_base::binary);
prv_testbits("testTriggered(): OpeningFile");
fs.seekg(2000,std::ios_base::beg);
prv_testbits("testTriggered(): seekTwoThousand");
int g = fs.tellg();
std::cout << "get pointer is:" << g << std::endl;
}
void prv_testbits(std::string msg){
if (fs.fail()) {
std::cout << msg << ": failbit set." << std::endl;
} else {
std::cout << msg << ": failbit NOT set." << std::endl;
}
if (fs.bad()) {
std::cout << msg << ": badbit set." << std::endl;
}else {
std::cout << msg << ": badbit NOT set." << std::endl;
}
if (fs.eof()) {
std::cout << msg << ": eofbit set." << std::endl;
} else {
std::cout << msg << ": eofbit NOT set." << std::endl;
}
}
....
private:
std::ifstream fs;
};
输入文件由二十个字节组成: 0123456789abcdefghij
示例运行的输出:
testTriggered(): OpeningFile: failbit NOT set.
testTriggered(): OpeningFile: badbit NOT set.
testTriggered(): OpeningFile: eofbit NOT set.
testTriggered(): seekTwoThousand: failbit NOT set.
testTriggered(): seekTwoThousand: badbit NOT set.
testTriggered(): seekTwoThousand: eofbit NOT set.
get pointer is:2000
G++ 版本信息:$ g++ -v使用内置规范。目标:x86_64-linux-gnu配置: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' -with-gxx-include-dir=/usr/include/c++/4.4 [snip]gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
$ uname -aLinux hostx 2.6.32-36-server #79-Ubuntu SMP 星期二 十一月 8 22:44:38 UTC 2011 x86_64 GNU/Linux
fseek()
的开放组规范(可能用于实现fstream::seekg
)是必需的,以允许文件位置超出当前文件末尾:
fseek() 函数应允许在文件中现有数据的末尾之外设置文件位置指示器。如果稍后在此写入数据,则在间隙中对数据的后续读取应返回值为 0 的字节,直到数据实际写入间隙。
http://pubs.opengroup.org/onlinepubs/009696699/functions/fseek.html
相关文章:
- 分段故障(堆芯转储)矢量
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 调试 CUDA MMU 故障
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 正在处理故障(堆芯转储)
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- C++函数过载会导致 SEG 故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 当新的故障时,是否有必要留出一些紧急内存?
- Python & C-C++ 扩展模块案例段故障
- 带升压的 SEG 故障::make_shared / 特征3 内存.h.
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串