ページ 11

1行に複数の数値のデータが書かれているtxtファイルの読み込み

Posted: 2008年12月05日(金) 18:00
by 鹿好き
初めて質問させていただきます,一応規約と注意事項を拝見さしていただきましたが
一応丸投げではないと思い投稿させてもらいます.
さて本題ですが,
1行に複数の数値のデータが書かれているtxtファイルの読み込みをするプログラムの作成を行っているのですが,
とりあえずこのようなプログラムを組んでみました.
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
	double x,y,z,w;
	int i,N=50;
	FILE *fp;
	fp = fopen("test.txt","r");
	fscanf(fp,"%lf %lf %lf %lf\n",&x,&y,&z,&w);
	printf("%lf %lf %lf %lf\n",x,y,z,w);
	fclose(fp);
}
でtxtファイルの内容が
-47.500000 86.000000 8.000000 0.000000
のときは問題ないのですが
34.500000154.000000 7.425000 0.000000
のような数値同士の間に空白が入ってない場合の読み込みがうまくいきません.
34.500000 154.000000 7.425000 0.000000
↑のようにtxtファイルのほうで空白を入れれば動くのは分かるんですが,
何とかプログラム側でがんばって読み込む方法は無いでしょうか?
(txtデータは10.6fで出力されているようです)

C言語の能力は機械工学生が基礎科目でとりあえず学んだ程度,ファイル入出力に関しては今回がほぼ初めてです.
使用コンパイラ CPad for LSI C-86
OSはウィンドウズXPです

質問がわかり難い、見にくい等あると思いますが、
どうぞよろしくお願い致します。

Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み

Posted: 2008年12月05日(金) 18:35
by バグ
1データ辺りの文字数が固定ならばなんとかなりますが、そうでないならば無理です。

Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み

Posted: 2008年12月05日(金) 19:06
by 御津凪
> (txtデータは10.6fで出力されているようです)

とあるので、'.'以降は6個の数値が固定となっているので、その点を利用すれば、何とかできそうです。

とりあえず出来る関数を書いてみました。
(習っていない部分のはずなので、できるということで参考程度にとどめて置いてください)
// str には、符号小数点値、半角文字のみが入っていると仮定
const char* get_float( float* outFloat, const char* str ){
    char buf[32];
    const char* p;
    int len;

    // 先頭の空白文字をスキップ
    while(*str == ' ' || *str == '\n' || *str == '\t'){
        str++;
    }
    p = str;
    // 数値に関係ない文字('.'を除く)が出るまでスキップ
    while(('0' <= *p && *p <= '9') || *p == '-'){
        p++;
    }
    // *p が'.'ならば
    if(*p == '.'){
        p += 6; // 小数点以下6桁分移動
    }
    len = p-str; // 文字長を計算
    strncpy(buf,str,len); // 一旦一時バッファにコピー
    buf[len] = '\0';
    *outFloat = (float)atof(buf); // float に変換
    return p; // 次のデータの先頭位置を返す。
}
# コンパイルチェックしていないので正しく動くかは未定です。

Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み

Posted: 2008年12月05日(金) 19:14
by Dixq (管理人)
34.500000154.000000 7.425000 0.000000
の境目が
34.500000 | 154.000000 7.425000 0.000000
だと解るのは、小数点以下が6文字だとわかっているからですよね。
その点を考えれば分けれると思います。
色々やり方はあるでしょうけど、
fgetcでループさせ、一文字ずつ取ってきて、順次文字列を格納する配列に文字データをいれていき、
「.」が見つかったら6文字取ってきて最後に終端記号をいれ、
atofで実数型に変換すればいいと思います。

Re:1行に複数の数値のデータが書かれているtxtファイルの読み込み

Posted: 2008年12月06日(土) 17:17
by 鹿好き
バグさま、御津凪さま、管理人さま、すばやい対応ありがとうございます
とりあえず御津凪さまプログラムと管理人さまのおっしゃられたやり方を参考に、
なんとかがんばってみたいと思います。
習ってないからできない、なんて堂々と言えたら楽なんですけどねw

また何か行き詰ったら知恵をお貸しいただけたらと思います。
それでは、本当にありがとうございました。