ifstream readsome 究竟是如何工作的

how does ifstream readsome exactly work

本文关键字:工作 何工作 readsome 究竟 ifstream      更新时间:2023-10-16

我想做的是,一次发送一个文件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(。然后,该函数继续使用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);
}