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

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 に答える
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 に答える