0

次のようなテキストファイルがある場合:

4

1 2 3

4 5 6

7 8 9

10 11 12

数値の各列を変数x、y、zに読み込みたい。したがって、読んだ後、z = [3、6、9、12]。

テキストファイルを解析して、各列のすべての行を独自の変数に格納するにはどうすればよいですか?

したがって、テキストファイル全体を各行に「/ n」を含む文字列として保存してから、各行にx = sting [i]、y = string [i + 1]、z = string [i + 2]を解析しますか?またはそれに似たもの。

特にnが非常に大きい場合は、これを行うためのより良い方法があるはずだと思います。

〜(編集)一番上の最初の数字(この場合は4)は、テキストファイルの行数を決定します。したがって、n = 4に設定すると、forループが発生します。for(i = 0; i

4

3 に答える 3

3

Read it one item at a time, adding each item to the appropriate array:

std::vector<int> x,y,z;
int xx, yy, zz;
while(std::cin >> xx >> yy >> zz) {
  x.push_back(xx);
  y.push_back(yy);
  z.push_back(zz);
}


EDIT: responding to added requirement

int n;
if( !( std::cin >> n) )
  return;

std::vector<int> x,y,z;
int xx, yy, zz;
while(n-- && std::cin >> xx >> yy >> zz) {
  x.push_back(xx);
  y.push_back(yy);
  z.push_back(zz);
}
于 2012-09-04T20:53:52.280 に答える
1

「ユニバーサル」ソリューションを目指しています(ここnで、は列の数です)。このような場合、個別のベクトル変数の代わりに、ベクトルのベクトルを使用することをお勧めします。

std::fstream file("file.txt", ios_base::in);
std::vector< std::vector<int> > vars(n, vector<int>(100));
int curret_line = 0;

while (!file.eof())
{
  for (int i=0; i<n; ++i)
  {
    file >> vars[i][current_line];
  }
  ++current_line;
  // if current_line > vars[i].size() you should .resize() the vector
}

編集:以下のコメントに従ってループを更新

int i=0, current_line = 0;
while (file >> vars[i][current_line])
{
  if (i++ == n) 
  {
    i = 0;
    ++current_line;
  }
}
于 2012-09-04T21:22:00.370 に答える
0

基本的なエラーチェックを行う方法の 1 つを次に示します。整数が 3 つ未満または 3 つを超える行をエラーとして扱います。

#include <fstream>
#include <string>
#include <sstream>
#include <cctype>    

std::ifstream file("file.txt");
std::string line;
std::vector<int> x,y,z;

while (std::getline(file, line)) {
    int a, b, c;
    std::istringstream ss(line);

    // read three ints from the stream and see if it succeeds
    if (!(ss >> a >> b >> c)) {
        // error non-int or not enough ints on the line
        break;
    }

    // we read three ints, now we ignore any trailing whitespace
    // characters and see if we reached the end of line
    while (isspace(ss.peek()) ss.ignore();
    if (ss.get() != EOF) {
        // error, there are more characters on the line
        break;
    }

    // everything's fine
    x.push_back(a);
    y.push_back(b);
    z.push_back(c);
}
于 2012-09-04T21:29:44.513 に答える