Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;getline和gcount_C++ - Fatal编程技术网

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),可以设置故障位因此,我认为
==
是正确的选择。