Как сказать stringstream игнорировать нулевой завершающий символ? - PullRequest
0 голосов
/ 03 ноября 2019

Есть ли какой-нибудь способ сказать потоку строк игнорировать нулевой завершающий символ и все равно прочитать определенное количество символов?

Как вы можете видеть из этого минимального примера, хотя массив символов состоит из 3 символовпоток строк заканчивается на второй позиции:

#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

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Этот вопрос не о струнных потоках. Проблема в том, что вы неявно создаете std::string из const char* для этого аргумента конструктора stringstream, и делаете это с использованием перегрузки, которая ожидает C-строку. Поэтому, естественно, вы должны ожидать поведения, подобного C-string.

Вместо этого вы можете сформировать аргумент, используя конструктор std::string(const char*, std::size_t), или отправить данные в построенный по умолчанию поток строк, используя .write. * 1007. *

2 голосов
/ 03 ноября 2019

В дополнение к другому ответу, объясняющему основную проблему (создание 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
...