我使用std::fstream通过成员函数getline()逐行读取文本文件。它使用有限大小的缓冲区,有时输入的行比缓冲区长。第一次读取长行
getline()
后停止读取数据,调试代码后令我惊讶的是。文档指出,读取长行会设置错误标志 **failbit
,**它被描述为通常情况,而不是运行时错误或致命故障(https://cplusplus.com/reference/istream/istream /getline/)。文档没有指出此标志,也没有描述如何处理长行。
您知道如何处理长线吗?应该是这样,因为这种行为会影响所有类 std::fstream,但我从未看到任何描述或讨论。
程序示例:
#include <fstream>
#include <iostream>
#include <string>
int main(){
char buffer[10];
std::string filename{"test.txt"};
auto file=std::fstream(filename, std::ios_base::in | std::ios_base::binary );
if(file.is_open()){
size_t readBites{4};
file.getline(buffer,readBites);
auto length=std::strlen(buffer);
auto lengthStream=file.gcount();
std::cout << "Read "<<length<<"/"<<lengthStream<<":"<<buffer<<std::endl;
file.getline(buffer,readBites);
length=std::strlen(buffer);
lengthStream=file.gcount();
std::cout << "Read "<<length<<"/"<<lengthStream<<":"<<buffer<<std::endl;
}
return 0;
}
如果 test.txt 文件包含 ,例如:
1234567890
ABCDEFGHIJK
我期望输出(如 C 中的
fgets(...)
):
Read 3/3:123
Read 3/3:456
但确实如此:
Read 3/3:123
Read 0/0:
我使用有限大小的缓冲区,因为这是客户端软件的要求,调用此代码,它可以是任意大小并在短缓冲区中处理长行。