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
,(我不知道这与问题有多大关系)
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()
来确定保证可用字符的数量,而 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);
}
我想做的是,一次发送一个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()
来确定保证可用字符的数量,而 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);
}