струнные потоки и форматирование - PullRequest
1 голос
/ 26 декабря 2011

Я использую C ++ и пишу программу, которая должна делать кучу вещей с простыми числами.Однако главная проблема заключается в том, что у меня возникают проблемы с преобразованием между int и строками.Я считаю, что ниже приведен соответствующий код:

for(int j=0;j<size-1;j++){
  num=primes[j];
  ss<<num;
  ss>>temp;
  ss.str("");
  for (int count=0; count < temp.size(); count++) {
      cout<<temp<<endl;
  }

Я знаю, что мог бы Google и выяснить, как конвертировать из целого числа другим способом.Однако у меня есть ощущение, что причина, по которой я не могу понять, что происходит, заключается в том, что мне не хватает фундаментальных знаний о струнных потоках, которые я не знаю, и надеюсь, что это можно исправить.num - это целое число, ss - это поток строк, а cout temp выводит 2 каждый раз, что является значением primes[0].Я думаю, что после первого испытания струнный поток может не читаться из-за чего-то, связанного с символом перевода строки, но я действительно не знаю.

1 Ответ

2 голосов
/ 26 декабря 2011

Причина того, что вы испытываете, состоит в том, что EOF_BIT будет установлен в ss после считывания первого значения в temp, после чего никакие операции чтения / записи в std::stringstream и, следовательно, temp невозможны. не обновляется с новым значением.

Более понятный человеку способ объяснения вышесказанного; std :: stringstream ss будет думать, что он достиг конца (который он имеет в какой-то момент). Вам нужно будет указать, что он должен начинаться заново (сбросить все флаги ошибок), чтобы его можно было использовать в другой итерации.


Как мне решить эту проблему?

Существует несколько доступных методов, для меня наиболее понятным (в отношении читабельности кода) является использование нового std::stringstream для каждого итератора в цикле (см. " Пример решения # 2 ).

Обратите внимание на фрагменты ниже, которые все будут выводить:

2
3
5
7
11
13
17

Пример решения # 1

  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};

  std::stringstream ss; 
  std::string temp;

  for (int i =0; i < PRIMES_SIZE; ++i) {
    ss << primes[i];
    ss >> temp;

    std::cout << temp << std::endl;

    ss.clear (); // unset error flags
  }

Пример решения # 2

  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};

  for (int i =0; i < PRIMES_SIZE; ++i) {
    std::stringstream ss;
    ss << primes[i];

    std::cout << ss.str () << std::endl;
  }

Пример решения # 3

  #include <iterator>

  ...

  int const PRIMES_SIZE         = 7;
  int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};

  std::stringstream ss;

  std::copy (primes, primes+PRIMES_SIZE, std::ostream_iterator<int> (ss, "\n"));

  std::cout << ss.str ();
...