有什么办法告诉字符串流忽略以null结尾的char并反正读取一定数量的char?
从这个最小的示例中可以看到,即使char数组由3个char组成,stringstream也会终止于第二个位置:
#include <sstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
char test[3];
test[0] = '1';
test[1] = '\0';
test[2] = '2';
stringstream ss(test);
char c;
cout << "start" << endl;
while (ss.get(c)) {
cout << c << endl;
}
if (ss.eof()) {
cout << "eof" << endl;
}
}
$ ./a.out
start
1
eof
答案 0 :(得分:4)
此问题与字符串流无关。问题是您正在从std::string
隐式地为该stringstream构造函数参数构造一个const char*
,并使用期望C字符串的重载来实现。因此,自然地,您应该期待类似C字符串的行为。
相反,您可以使用std::string(const char*, std::size_t)
构造函数来形成参数,或者使用.write
将数据发送到默认构造的字符串流。
答案 1 :(得分:2)
除了解释基本问题(从std::string
创建char*
的其他答案)之外,还有以下(多种)解决问题的一种方法,使用std::string_literals
:>
#include <iostream>
#include <string>
#include <sstream>
int main(){
using namespace std::string_literals;
const std::string str_with_null = "1\0002"s;
std::stringstream ss(str_with_null);
char c;
while (ss.get(c)) {
std::cout << static_cast<int>(c) << '\n';
}
}
运行时,应打印出来:
49
0
50