gpt4 book ai didi

c++ - ifstream readsome 是如何工作的

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:17 28 4
gpt4 key购买 nike

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

这是我的代码:

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

file 是文本文件的 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()。此函数的默认实现是返回缓冲区中已知的字符数(即 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);
}

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com