将getline()数字字符串转换为数组或整数

时间:2012-09-06 03:04:59

标签: c++

我有一个文本文件写为:

1 2 3
7 8 9
13 14 15

目标是使每列成为整数数组,例如x=[1,7,13]y=[2,8,14]z=[3,9,15]

这是我到目前为止所拥有的......

我打开文本文件并以字符串形式读入内容:

string fileText;
int n;
int result[];
    //file open
        ifstream input ("input.txt");

    //file read
        if(input.is_open())
        {

            for(int i=0; i<n; i++) //n=3 in this case
            {
                 getline(input, fileText);
                 result = strtok(fileText," "); // parse each line by blank space " ".
                  //i get various errors here depending on what I try: such as "must be lvalue" 
                  //or a problem converting string to char.

                 x[i] = result[0];
                 y[i] = result[1];
                 z[i] = result[2];
            }

 }

所以我的问题是将一行文本转换为由空格分隔的数字到整数数组。

这在PHP等高级语言中非常简单,但在C ++中,数据类型和内存分配更加复杂......等等。我是新手!

由于

如果没有矢量,我该怎么做?

如果说我有: int x *,y *,z *;

然后为每个变量指针分配内存:

    x = (int*) malloc (n*sizeof(int)); // where n is the number of lines in the text doc.
    y = (int*) malloc (n*sizeof(int));
    z = (int*) malloc (n*sizeof(int));

现在我想将每列放入每个x,y,z整数数组中。

我可以这样做:

...

std::string line;
int i;
for (int k=0; k<n; k++) 
{
        while (std::getline (input, line))
        {
        std::stringstream parse(line);

        parse >> i;
        x[k] = i;
        parse >> i;
        y[k] = i;
        parse >> i;
        z[k] = i;

        }


    }

现在x = [1,7,13]等等。

有没有办法在不使用push_back()方法的情况下执行此操作? 我只想读入每个数组的整数。

使用getNextInt()或其他什么?

2 个答案:

答案 0 :(得分:4)

如果您的文件很简单,您只需执行以下操作:

 std::vector<std::vector<int>> v;
 ifstream input("input.txt");
 for(int x, y, z; input >> x >> y >> z;)
     v.push_back(std::vector<int>{x, y, z});

std::tuple

 std::vector<std::tuple<int, int, int>> v;
 ifstream input("input.txt");
 for(int x, y, z; input >> x >> y >> z;)
     v.emplace_back(x, y, z);

这根本不需要转换,只要流失败就会失败。两者都需要,C ++ 11支持,所以如果您需要C ++ 03解决方案,请告诉我。

如果你想坚持使用普通的旧数组:

 ifstream input("input.txt");
 for(int i = 0; input >> x[i] >> y[i] >> z[i]; ++i)
     ;

答案 1 :(得分:4)

使用从getline返回的字符串创建一个字符串流可能是最“C ++”的方式来完成你想要做的事情。

std::vector<int> x, y, z;
ifstream input ("input.txt");
if(input.is_open())
{
    std::string line;
    int i;
    while (std::getline (input, line))
    {
        std::stringstream parse(line);
        // assuming 3 just like you had
        parse >> i;
        x.push_back (i);
        parse >> i;
        y.push_back (i);
        parse >> i;
        z.push_back (i);
    }
}

没有必要进行条件检查,但我原来就把它留下了。