[解決済み] テキストファイル入力の読み込み・解析 c++
質問
少し背景を説明します。私は学校のプロジェクトでスライディングブロックパズルに取り組んでおり、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
でパースし、その行から文字列ストリームを作成します。
>>
. これは、先に紹介した直接形式での抽出では、いかなるエラーからも回復できないのに対して、悪い行を発見してスキップし、回復できるという利点がある。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] 未定義の動作とシーケンスポイント
-
[解決済み] HTML5でfloat入力タイプはありますか?
-
[解決済み] 入力テキスト要素のボーダーハイライトを削除する方法
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++