2

我有一个文本文件写成:

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() 什么的?

4

2 回答 2

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)
     ;
于 2012-09-06T03:18:41.263 回答
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);
    }
}

条件检查不是必需的,但我将其保留为您最初的样子。

于 2012-09-06T03:22:45.877 回答