我要做的是一次发送一个8kB的文件。 (不使用完整文件填充RAM)
这是我的代码:
while ( file.good()){
file.readsome(sinLine,8000);
client.saveFile(_return, std::string(sinLine), file_name);
}
文件是文本文件的
std::ifstream
。客户是
thriftClient
,(我不知道与问题的相关性如何)sinLine
是char * [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/