- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想做的是,一次发送一个 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/
我写了上面的代码来测试“readsome”。当使用“读取”时,代码可以工作,但需要等待输入 0x10 个字符才能工作。使用“readsome”,我的系统(ubuntu Linux 3.13.0-37)
我想做的是,一次发送一个 8kB 的文件。 (没有用完整文件填充 RAM) 这是我的代码: while ( file.good()){ file.readsome(sinLine,8000);
我调查了如果缓冲区中没有足够的空间,方法 ifstream::readsome(buf, size) 不会读取所有字节。示例: 我有缓冲区:4096 字节。从文件开始的偏移量:6 字节。我调用 ifs
我目前在使用 boost::asio 时遇到问题,我想像下面的代码一样编写和读取。写入工作正常,但读取总是返回零。其实我也发现每个网站都指的是 read_some 函数而不是 readsome 函数库
上下文:我正在尝试用 C++ 读取 PNG 图片的内容,以便稍后将其发送到我的 Android 应用程序。为此,我以二进制模式打开文件,按 512 字节的 block 读取它的内容,然后将数据发送到应
这就像 readsome 甚至没有阅读。返回 0 并且不读取任何字符。这里有什么问题? #include #include int main () { std::fstream stream(
这段代码永远循环: #include #include #include int main(int argc, char *argv[]) { std::ifstream f(argv[
我用 C++ 代码和辅助工具 pv(管道查看器)做了一个简单的测试。代码是: #include #include int main() { std::array buffer; w
这些功能有什么区别。当我使用它们时,它们都做同样的事情。例如所有三个调用都返回 "hello": #include #include int main() { stringstream s
我只是采用了一些在 Linux 下开发的文件阅读器的旧代码,并尝试在我的 Windows 项目中使用完全相同的代码,该项目是用 MSVC++7.1 编译的。代码编译没有任何问题,但根据 Windows
我是一名优秀的程序员,十分优秀!