ifstream readsome 是如何工作的

how does ifstream readsome exactly work

我想做的是,一次发送一个8kB的文件。 (没有用完整文件填充 RAM)

这是我的代码:

while ( file.good()){
    file.readsome(sinLine,8000);
    client.saveFile(_return, std::string(sinLine), file_name);
}

文件是 std::ifstream 文本文件。
客户是 thriftClient,(我不知道这与问题有多大关系)
sinLinechar * [8000]

问题是接收的文件是242.2kB,发送的文件是142.6kB。

在调试器中我注意到它经历了超过 18 次循环 (142 / 8 = 17.25),但它并没有永远持续下去(我不知道确切的次数,但可能是242 /8 次)。

我还注意到每隔三个循环(3、6、9...)sinLine 的值没有显示在我的 IDE(QtCreator)中。

所以我的问题是,readsome() 是如何工作的?我用对了吗?还是我应该使用不同的功能?或者从 char * 到 std::string 的转换可能不正确?

函数 readsome() 相当无用,可能无法满足您的期望。它通过调用 in.rdbuf()->in_avail() 来确定保证可用字符的数量,而 in.rdbuf()->in_avail() 本身又调用 virtual 函数 showmanyc()。此函数的默认实现是 return 缓冲区中已知的字符数(即 std::streambuf 上的 egptr() - gptr())。该函数然后使用 in.rdbuf()->sgetn(buffer, n)).

对许多字符进行简单的 read()

请注意,您可以使用 in.gcount() 来确定实际读取了多少个字符,但最后一个未格式化的输入函数。与确定下一个空字符之前的字符数相比,这为您提供了更好的读取字符数。特别是当未格式化的输入函数不尝试空终止读取数据时。

此外,您对 file.good() 的检查也不是很好:假设您不走运并且最后一次成功读取恰好在最后一个元素处结束,那么最后一次输入将被处理两次。我强烈建议使用更像这样的循环:

for (char buffer[8196]; file.read(buffer, sizeof(buffer)); ) {
    client.saveFile(_return, std::string(buffer, buffer + file.gcount()), file_name);
}