C++ std::fstream getline() 在第一行长行后停止读取文件

问题描述 投票:0回答:1

我使用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:

我使用有限大小的缓冲区,因为这是客户端软件的要求,调用此代码,它可以是任意大小并在短缓冲区中处理长行。

c++ fstream getline
1个回答
2
投票

正如文档所述,如果您尝试读取的数据多于缓冲区可以容纳的数据,则会设置流的

failbit
状态。此时,流不会再读取任何数据,直到您
clear()
出现故障状态,而您并没有这样做。

© www.soinside.com 2019 - 2024. All rights reserved.