C++ C++;getline和gcount
假设我有一个指向以下内容的C++ C++;getline和gcount,c++,C++,假设我有一个指向以下内容的std::istream(换行符是'\n'字符): 并运行以下代码: std::istream & is = ... char buff[9]; is.getline(buff, 9); int n = is.gcount(); 现在n==8和strcmp(buff,“12345678”)==0。问题是,我怎么知道我读了整行而不是其中的一部分 如果蒸汽指向以下内容: 123456789 0 同样的代码被执行,我仍然在同一行。如何区分这两种情况?使用std::
std::istream
(换行符是'\n'
字符):
并运行以下代码:
std::istream & is = ...
char buff[9];
is.getline(buff, 9);
int n = is.gcount();
现在n==8
和strcmp(buff,“12345678”)==0
。问题是,我怎么知道我读了整行而不是其中的一部分
如果蒸汽指向以下内容:
123456789
0
同样的代码被执行,我仍然在同一行。如何区分这两种情况?使用
std::string
和免费的std::getline
函数:
#include <istream>
#include <string>
// ...
std::istream & is = ...;
std::string line;
while (std::getline(is, line))
{
// process line
}
#包括
#包括
// ...
std::istream&is=。。。;
std::字符串行;
while(std::getline(is,line))
{
//生产线
}
使用std::string
和免费的std::getline
函数:
#include <istream>
#include <string>
// ...
std::istream & is = ...;
std::string line;
while (std::getline(is, line))
{
// process line
}
#包括
#包括
// ...
std::istream&is=。。。;
std::字符串行;
while(std::getline(is,line))
{
//生产线
}
读取下一个字符。如果是换行符,则表示已读取该行中的所有数据
顺便说一句,流行的用法是将整行(直到换行符)读入
std::string
,然后处理字符串。读取下一个字符。如果是换行符,则表示已读取该行中的所有数据
顺便说一句,流行的用法是将整行直到换行符都读入
std::string
,然后处理字符串。答案的关键在于你的问题
is.getline(buff, 9);
int n = is.gcount();
Now n == 8
根据,它将提取多达n-1个
字符,在您的情况下,最多可提取8个字符。这有点误导,因为如果第n个字符是分隔符,它也将被提取(但不会复制到缓冲区)。更重要的是,如果您在到达n
字符之前未到达分隔符,则此部分是相关的:
If the function stops reading because this size (n) is reached,
the failbit internal flag is set
因此,简言之,如果设置了失败位,您仍然在同一行上(您必须清除状态才能继续处理istream)。有时,eof也会设置失败位。因此,您可能需要检查状态是否为failbit且仅为failbit:
if ( is.rdstate() == std::ios::failbit ) {
std::cout << "Filled the buffer, but did NOT finish the line\n";
is.clear();
}
if(is.rdstate()==std::ios::failbit){
答案的关键在于你的问题
is.getline(buff, 9);
int n = is.gcount();
Now n == 8
根据,它将提取多达n-1个
字符——在您的例子中,最多8个。这有点误导,因为如果第n个字符是分隔符,它也将被提取(但不会复制到缓冲区)。更重要的是,如果您在到达n
字符之前未到达分隔符,则此部分与以下内容相关:
If the function stops reading because this size (n) is reached,
the failbit internal flag is set
因此,简言之,如果设置了失败位,您仍然在同一行上(您必须清除状态才能继续处理istream)。有时,eof也会设置失败位。因此,您可能需要检查状态是否为failbit,而仅为failbit:
if ( is.rdstate() == std::ios::failbit ) {
std::cout << "Filled the buffer, but did NOT finish the line\n";
is.clear();
}
if(is.rdstate()==std::ios::failbit){
std::它应该是&
而不是=
?我最初有&
,但将其更改为=
。在其他情况下(例如eof),可以设置故障位,这也会设置eofbit。因此,我认为=
是正确的选择。它应该是&
而不是=
?我最初有&
,但将其更改为=
。在其他情况下(例如eof),可以设置故障位因此,我认为==
是正确的选择。