正在从字符串流中读取内容
Reading contents from a stringstream
我正在测试如何从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;
}
我得到了输出:
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
---
正如你可能注意到的,最后一次读取操作只读取了5个字符,去掉了最后两个"am",尽管它本应该能够读取它。我错过了什么吗?
实际上,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 );
只是为了澄清:
虽然我相信你观察到的行为是标准允许的,但我不明白当输入流基于字符串文字时,实现为什么会这样(我不熟悉流的实现细节)。您可以检查的是,如果read
实际上对应于rdbuf()->in_avail()
,如果它不对应,这可能确实是一个编译器错误。
相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何从二进制文件中读取字符串
- 如何在 c++ 中使用 getline 从文件中读取字符串?
- 读取字符串文本输入以创建 2D 矢量
- 罗马数字到阿拉伯语 (vinculum) - 读取字符串中的字符
- C++:从文件中读取字符串和整数,并获得最大数字
- C++,从文件中读取字符串,分段错误
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如何从内存中读取字符串?
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 我需要C++读取字符串数组中每个单词的第一个字母
- 读取字符串C++的字符时出错
- 读取字符串直到标志 (C++)
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++输入文件流无法从文件中读取字符串
- 读取字符串字符时出错
- 如何读取<字符串,矢量<对<int,字符串的映射>>>
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- C++ 使用 Strtok 读取字符串字符时出错
- 使用 getline 读取字符串,但每行中都有换行符