istream :: getline()没有得到最后一个字符?

时间:2016-02-19 06:47:34

标签: c++ file char getline

我试图从文件中获取完整的句子到字符缓冲区,以便在程序中进一步操作。使用istream函数getline完全正常,直到我遇到一个以" ..."结尾的句子。

这是一个例子:

  

C' est normal,vous venez de me demander ma main ...

我使用此代码获取输入:

ifstream Historique;
char buff_char[50];
// other stuff
Historique.getline(buff_char, 50, '\n');

我得到了什么:

  

C' est normal,vous venez de me demander ma main ..

然后,我试图在文件中再做一次getline,但它失败了,我只得到一个空字符""在我的缓冲区。我知道getline正在获得n-1个字符,但我告诉它要停在哪里,它适用于只有一个最终标点符号的其他句子。

知道可能是什么问题以及如何解决问题?

4 个答案:

答案 0 :(得分:1)

getline(buff_char, 50, '\n');

限制" get"到50个字符(包括空终止)。

  

C' est normal,vous venez de me demander ma main ...

太长了。

如果希望使用数组缓冲区,则需要将其设置得更大(至少为1)。

非会员"字符串"版本getline也是另一种选择;

ifstream Historique;
// ...
std::string line;
std::getline(Historique, line, '\n');

答案 1 :(得分:1)

你的字符串

C'est normal, vous venez de me demander ma main...
123456789|123456789|123456789|123456789|123456789|

长度为50个字符,但C字符串需要N + 1个字符,因为它们必须存储“nul”终结符' - 一个值为0的字节,它允许C函数知道字符串的结束位置。

因此,您需要将缓冲区大小增加到51个字节,或者您可能需要考虑使用C ++ std::string

#include <string>
// ...
ifstream Historique;
std::string buffer;
// other stuff
getline(Historique, buffer, '\n');

答案 2 :(得分:0)

增加数组buff_char

的大小

答案 3 :(得分:0)

char数组的最后一个字符始终为\0,因此将数组大小设置为比您想要的大一个。