我要做的是一次发送一个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()来确定保证可用的字符数,virtual本身又调用showmanyc()函数egptr() - gptr()。此函数的默认实现是返回缓冲区中已知的字符数(即std::streambuf上的read())。然后,该函数使用in.rdbuf()->sgetn(buffer, n))对许多字符进行简单的in.gcount()

请注意,您可以使用file.good()来确定实际读取的字符(最后一个未格式化的输入函数)的方式。与确定直到下一个空字符的字符数相比,这使您可以更好地读取字符。尤其是因为未格式化的输入函数不会尝试将读取的数据终止为null。

另外,检查ojit_code的效果不是很好:假设您不走运,并且最后一次成功的读取恰好在最后一个元素处结束,则最后一次输入将被处理两次。我强烈建议您使用类似以下的循环:

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

关于c++ - ifstream readsome如何正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34386144/

10-13 03:31