データファイル内の文字列を削除する

私は、.datファイルの正方行列と別の.datファイルのベクトルを読み込み、2つを増やしてガウスジョルダン消去を行い、拡張行列を行を減らした逐次型にするコードを書いています。私は今、ユーザーの入力が無意味である場合、それをユーザーフレンドリーにしてエレガントにクラッシュさせるようにしています。たとえば、行列が正方形であり、ベクトルの長さが行列の次元と一致することを確認するチェックがあります。私が今しようとしているのは、数字でないデータファイルに文字や記号があるかどうかを確認することです。

私の試み: scanf( "%lf"、)のようなものは、これらのシンボルのいずれかに遭遇したときに停止するという点で機能します。問題は、私の入力がコマンドラインからではないということです。 (コマンドラインは実際にはオプションではありません。なぜなら、ユーザがそこに座ってコマンドラインで入力したくない巨大な行列をコードが受け入れることができるようにするためです)。 fscanf( "%f"、)を実行すると、文字列に遭遇するとナットになります。 scanfのようなものがありますか?それは文字を見つけたときにただ止まりますが、狂っていませんか? そうでない場合は、他の提案はありますか?

1
追加された 編集された
ビュー: 1
それは全くクラッシュしないでください!すべての正常なプログラムはエラーチェックを行い、正常に動作しない場合はエラーで終了します。あなたの質問については、解析、検証、処理を分けるのが最もクリーンなので、解析や検証のエラーがあれば、ただ終了することができます。
追加された 著者 Kerrek SB,
+1は " ...エレガントにクラッシュします" :-)とにかく深刻なことに、私はKerrek SBが上に書いたことに完全に同意します!さらに、 scanf()は、 "狂った"の後に EOF を返すので、ランタイム中にこの条件を簡単にキャッチすることができます。
追加された 著者 alk,
文字列としてすべてを読んで、妥当性をテストし、変換する...
追加された 著者 Mitch Wheat,

1 答え

fgets を使用して、事前に割り当てられたバッファに行を取得し、次に strtoX を使用して浮動小数点数を抽出します。 float の場合は X = d = f long double に、 X = そのシグネチャは対応するタイプ( float 、 X_t )であり、X_t strtoX(const char * nptr、char ** endptr) double 、または long double )。

行の終わりに達するまで( ** endptr = '\ n' )、行ポインタを増やします(プリアロケートされたバッファを指すように設定されます。 > strtoX に移動し、isが実行されるまでインクリメントします。 次のように2つの変数を使用します。

char *lp = buf;
char *lp2 = buf;
do {
    X_t x = strtoX(lp, &lp2);
    if (lp == lp2 && *lp != '\n') {
        ++lp;
        continue;
     }
     if (*lp2 == '\n')
         goto read_line;
     //do something with x
 } while (1);

私のコードは素晴らしいことではありませんが、その点を示すべきです。

また、 X = fX = ldstrtoX C99/POSIX 2011まで。

1
追加された