1. ホーム
  2. c++

[解決済み] テキストファイル入力の読み込み・解析 c++

2022-02-25 08:18:23

質問

少し背景を説明します。私は学校のプロジェクトでスライディングブロックパズルに取り組んでおり、Javaの代わりにC++を使用するのは今回が初めてです。ファイルからデータを読み取るような実装をするのは初めてです。

テキストファイルからの入力の読み取りについて、素朴な疑問があります。 ファイルを一行ずつ読み、各行を文字列で保持する方法は理解していますが、ファイルを読み込む際に文字列を異なるデータ型にパースできるかどうかを知りたいのです。

現在、私は各行を読み、後で解析するためにベクターに文字列として格納していますが、もっと簡単な実装方法があるはずです。

最初の行はグリッドの長さと幅を示す2つの整数、次の行はブロックを作成する際の引数として使用する4つの整数とcharを保持します。

もし、ファイルを一文字ずつ読むのであれば、その文字が整数なのか文字なのか(そしてスペースを無視する)検出する関数はないのでしょうか?この場合、integer >10はどのように扱えばいいのでしょうか?

EDIT: fstreamを使ってファイルを読み込んでいますが、他の入力方法には慣れていません。

入力のサンプルです。

4  4
3  1  2  1  b
1  1  1  1  a 

解決方法は?

ある文字列が整数としてパースできるかどうかを検出するためには、それをパースして成功するかどうかを確認すればよいのです。そのための最適な関数は、おそらく std::strtoul() 何文字消費したかを教えてくれるので、その後にパースを続けることができるからです。(詳しくはマニュアルを参照してください)。

ただし、すでに 知っている ファイルのフォーマットは、iostream フォーマット抽出を使用することができます。これは非常に簡単です。

#include <fstream>


std::ifstream infile("thefile.txt");

int n1, n2, x1, x2, x3, x4;
char c;

if (!(infile >> n1 >> n2)) { /* error, could not read first line! Abort. */ }

while (infile >> x1 >> x2 >> x3 >> x4 >> c)
{
    // successfully extracted one line, data is in x1, ..., x4, c.
}

もう一つの方法は、すべての行を文字列に読み込むことです ( std::getline でパースし、その行から文字列ストリームを作成します。 >> . これは、先に紹介した直接形式での抽出では、いかなるエラーからも回復できないのに対して、悪い行を発見してスキップし、回復できるという利点がある。