Как прочитать все числа в строке одно за другим в массив (c ++) - PullRequest
0 голосов
/ 16 декабря 2010

Я видел похожий вопрос, но ответы не работали на моем Visual C ++ 6. У меня есть CString (класс Visual C ++ String) с числами, разделенными запятыми:

CString szOSEIDs = "5,2,6,345,64,643,25,645";

как они помещают один за другим в массив int.Я попробовал струнный поток, но он дает мне только первый int.Может кто-нибудь помочь?

PS Это моя неудачная попытка:

std::string input;
input = (LPCTSTR)szOSE_IDs;    // convert CString to string 
std::stringstream stream(input);
while(1) {
  int n;
  stream >> n;
  if(!stream)
    break;
  szSQL.Format("INSERT INTO TEMP_TABELA (OSE_ID) values (%d)", n);  // I create SQL from my IDs now available
  if(!TRY_EXECUTE(szSQL)) //This just a runner of SQL
    return false;
}

В этом случае я получу только первое число (5), и будет запущен только мой первый SQL.Есть идеи?Спасибо

Ответы [ 4 ]

1 голос
/ 16 декабря 2010

Проблема в том, что stream >> n завершается ошибкой, когда он достигает , в вашей строке.Вы не можете токенизировать строку таким образом - вместо этого посмотрите на библиотеку, такую ​​как boost, которая предоставляет хороший токенизатор.

Однако, если вы можете гарантировать, что ваша строка всегда выглядит так, вы можете попробовать:

  int n;
  while (stream >> n)
  {
    // Work with the number here
    stream.get(); //skip the ","
  }

Это избавит вас от необходимости тянуть буст и т. Д.

0 голосов
/ 16 декабря 2010
CString nums = _T("5,2,6,345,64,643,25,645");
CString num;
std::vector<int> intv;
int pos = 0;
do {
    if ((num = nums.Tokenize(_T(","), pos)) != _T(""))
        intv.push_back(_ttoi(num));
    else
        break;
} while (true);
0 голосов
/ 16 декабря 2010
typedef size_t pos;
  pos p; 
  string str("5,2,6,345,64,643,25,645");
  string chopped(str);
  string strVal;
  bool flag = 1;
  do{
    p = chopped.find_first_of(",");
    if(p == chopped.npos)
      flag = 0;
    strVal = chopped.substr(0,p);
    chopped = chopped.substr(p+1);
    //cout << chopped << endl;
    cout << strVal << endl;

  }while(flag);
0 голосов
/ 16 декабря 2010
parse(CString& s, std::vector<int>* v)

{
 int l = s.size();//or something like this
 int res = 0;
 for(int i = 0; i < l; ++i)
 {
  if(s[i] == ',')
  {
   v->push_back(res);
   res = 0;
   continue;
  }
  res*=10;
  res+=s[i] - '0';
 }
 v->push_back(res);
}
int main()
{
 CString s="1,2,3,4,15,45,65,78";
 std::vector<int> v;
 parse(s, &v);
 //...
 return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...