使用strtok()和stringstream的问题

时间:2013-04-22 23:10:21

标签: c++ c fstream stringstream strtok

我现在已经摆弄了一段时间,所有它返回的是' save.rp'中的前两个数字。文件分开,

int characterPosition [2] = {0,0};

string convToStr(char *ch)
{
    stringstream ss;
    string res;
    ss << ch;
    ss >> res;
    return res;
}

int convToInt(string ch)
{
    stringstream ss(ch);
    int num;
    ss >> num;
    return num;
}

void loadSave()
{
    string loadPos;
    ifstream file("save.rp");
    if ((file.is_open())&&(file.good()))
    {
        getline(file,loadPos);
    }
    file.close();

    char str[] = {*loadPos.c_str()};
    char delim[] = "-";
    char *result = NULL;
    result = strtok(str, delim);
    int num = 0;
    while (result != NULL)
    {
        characterPosition[num] = convToInt(convToStr(result));
        cout << characterPosition[num] << endl;
        result = strtok(NULL, delim);
    }
}

&#39; save.rp&#39;文件看起来像这样:400-2000

它应该分别返回每个数字,在这种情况下为400和2000.

我在这里做些蠢事吗?

3 个答案:

答案 0 :(得分:2)

这一行

char str[] = {*loadPos.c_str()};

相当于

char str[] = {'4'};

这显然不是你想要的,你想要的

char str[] = "400-2000";

这样做

char str[500];                  // assuming your line length dont exceed 500
strcpy( str, loadPos.c_str() );

答案 1 :(得分:0)

问题出在这里

char str[] = {*loadPos.c_str()};

loadPos.cstr()返回指向“400-2000”的指针; *取消引用并给出第一个字符 - 即'4'。 用第一个char'4'初始化str []。 str现在是一个以'4'开头的数组,上帝知道之后是什么。您的所有操作都已完成。

将以上行更改为

char str[100];
strcpy(str,loadPos.c_str());

以下是如何避免strtok和convToStr

int convToInt(string ch)
{
   stringstream ss(ch);
    int num;
    ss >> num;
    return num;
}

void loadSave()
{
    string loadPos;
    ifstream file("save.rp");
    if ((file.is_open())&&(file.good()))
    {
        getline(file,loadPos);
    }
    file.close();

    stringstream ss(loadPos);
    string token;

    while(getline(ss, token, '-'))
    {
        int r = convToInt(token);
        cout<<r<<endl;
    }

}

答案 2 :(得分:0)

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {
    ifstream inf("save.rp");
    int characterPosition [2] = {0,0};
    int num=0;
    string line_buff;
    while(inf.good()){
        getline(inf, line_buff, '-');
        stringstream ss(line_buff);
        ss >> characterPosition[num++];
    }
    cout << characterPosition[0] << ',' << characterPosition[1] << endl;
    return 0;
}