我正在测试如何读取数据,std::streamstring但我弄错了,有人能指出问题是什么吗?并给出一个正确的阅读方式?
我的测试代码是:
#include <iostream>
#include <string>
#include <sstream>
#define BUFFER_SIZE 16
int main(int argc, char ** argv)
{
std::stringstream ss;
ss << "Un texto con datos de ejemplo para probar la extacción de un stream";
std::cout << "Stream contents: '" << ss.str() << "'" << std::endl;
char buffer[BUFFER_SIZE] = {0};
std::streamsize read = 0;
do {
read = ss.readsome(buffer, BUFFER_SIZE - 1);
std::cout << "Read: " << ss.gcount() << std::endl;
std::cout << buffer << std::endl;
std::cout << "---" << std::endl;
std::fill(buffer, buffer + BUFFER_SIZE, 0);
} while ( read > 0 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出:
Stream contents: 'Un texto con datos de ejemplo para probar la extacci¾n de un stream'
Read: 15
Un texto con da
---
Read: 15
tos de ejemplo
---
Read: 15
para probar la
---
Read: 15
extacci¾n de un
---
Read: 5
stre
---
Read: 0
---
Run Code Online (Sandbox Code Playgroud)
正如您可能已经注意到,上次读取操作只读取了5个字符而忽略了最后两个"上午",即使它应该能够读取它.我错过了somtehing吗?
实际上,readsome只读取立即可用的字符,这取决于平台,因此当流中仍然有字符时,完全允许返回 0,并且后续调用可能会返回丢失的字符。为了获取所有可用数据,我宁愿read结合使用来gcount获取您读取的字符数。
do {
ss.read(buffer, BUFFER_SIZE - 1);
read=ss.gcount();
std::cout << "Read: " << ss.gcount() << std::endl;
std::cout << buffer << std::endl;
std::cout << "---" << std::endl;
std::fill(buffer, buffer + BUFFER_SIZE, 0);
} while ( read > 0 );
Run Code Online (Sandbox Code Playgroud)
只是为了澄清:
虽然我相信,您观察到的行为是标准所允许的,但我不明白为什么当输入流基于字符串文字时实现应该像这样(我不熟悉流的实现细节) )。您可以检查的是,是否read确实对应rdbuf()->in_avail(),如果不对应,这可能确实是一个编译器错误。
| 归档时间: |
|
| 查看次数: |
1751 次 |
| 最近记录: |