ページ 11

解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:32
by むら
掲示板をはじめて利用させていただきます。

gccで解析プログラムを作っています。

いまは、ハードコードを書いて直接変数・配列にデータを入れてテストしています。
ちょっとレベルアップしてテキストファイルから読み込んでやってみようと、考えていて、
頭に思い浮かんだのが
プログラムは一行読み込んで分解し、変数・配列に格納です。
このやり方だと、行番や一行ごとの数字の数がずれると、最悪です。
そこをうまくやるのが、プログラミングだとおもうのですが、
ほんとにみんなこうやってんのかな?といった疑問が頭をよぎります。
テキストファイルから読み込む妙案があれば教えてください。

5,9 //iN・iM
0,1,2,3,4 //N1
1,2,3,4,5 //N2
....
//は便宜上のコメント

ある程度変則なデータ形式でも対応できる考え方があれば教えてください。
iniファイル的な形のものも一つのアイデアですが、出力はできても、手入力はちょっとです。
エクセルに入力してVBAで読み込んでdllへも既知です。

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:39
by h2so5
自分だったらXMLなどを使うと思います。
ライブラリやエディタなどはそれこそ腐るほどありますし。

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:45
by softya(ソフト屋)
> iniファイル的な形のものも一つのアイデアですが、出力はできても、手入力はちょっとです。
それだとxmlも不可でしょうか?
あとインタプリタ風の構文処理にして、C言語の初期化の書き方と言う手もありますけどね。

自由度が高いためには、ある程度構文を考える必要がありますが、それだと手間は増えます。

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:49
by むら
ご返信ありがとうございます。
具体的なハードコードは下記の様にしていて
部材数が多くなると結構煩雑。
xmlもちょっと面倒的な気持ち。。。htmlタグを書くような感じなので。
ほかにもこんな手があるよというのを教えてほしいです。
xmlもその一つとして、いただきます。

私の思っているのは、テキストエディタでガンガンテンキーのみでうてて、
コメントもいれてもロバストでデータの順番が入れ替わっても・・・
特に指定はないのですが、知識の幅を広げたいのもあります。

コード:


		case 4:{		//テストデータはオリジナル

			//解析時間
			o2->dTime=0;

			//節点数	//部材数
			o2->iNode=3;	o2->iMemb=2;

			//配列を確保
			o2->fcSetArr(); //private member

			//節点支持状態	=0:支点でない =1:固定支点 =2:ピン支点 =3:水平ローラー支点
			o2->iSup[0]=1;o2->iSup[1]=0;o2->iSup[2]=0;
			//節点座標
			o2->dXNode[0]=0;o2->dYNode[0]=0;
			o2->dXNode[1]=0;o2->dYNode[1]=300;
			o2->dXNode[2]=400;o2->dYNode[2]=300;
			//部材端番号
			o2->iN1[0]=0;o2->iN2[0]=1;
			o2->iN1[1]=1;o2->iN2[1]=2;
			//弾性係数 断面積
			o2->dE[0]=20500;o2->dI[0]=1805.6;o2->dA[0]=26.67;
			o2->dE[1]=20500;o2->dI[1]=1805.6;o2->dA[1]=26.67;
			//節点荷重
/*
			o2->dYNodeLoad[1]=-3;
			o2->dYNodeLoad[2]=-4;
*/
			//中間荷重用 固定端反力 基準座標系
			// 左回 ←|-----------------------|←右回
			//       ↑                       ↑

			o2->dXiMembLoad[0]=0.0;	o2->dYiMembLoad[0]=0.0;	o2->dMiMembLoad[0]=0.0;
			o2->dXjMembLoad[0]=0.0;	o2->dYjMembLoad[0]=0.0;	o2->dMjMembLoad[0]=0.0;

			o2->dXiMembLoad[1]=0.0;	o2->dYiMembLoad[1]=49.0;	o2->dMiMembLoad[1]= 4900.0;
			o2->dXjMembLoad[1]=0.0;	o2->dYjMembLoad[1]=49.0;	o2->dMjMembLoad[1]=-4900.0;

			break;
		}
 

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:55
by softya(ソフト屋)
データの順番を入れ替えてもってのは識別子という判定基準がないので難しいですね。
あとは、構文解析処理で作れそうな気がします。

/5,9/ //コメント
/0,1,2,3,4/ //コメント
/1,2,3, //コメント
4,5/ //コメント

ぐらいなら構文解析をちゃんと作ればOKです。

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 15:57
by softya(ソフト屋)
ただ、結局データの打ち込みと後々の修正・チェックしやすいと言う観点からするとExcelで入力してcsvとするのが一番多いパターンなのでは?

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 16:10
by むら
softya(ソフト屋) さんが書きました:データの順番を入れ替えてもってのは識別子という判定基準がないので難しいですね。
あとは、構文解析処理で作れそうな気がします。

/5,9/ //コメント
/0,1,2,3,4/ //コメント
/1,2,3, //コメント
4,5/ //コメント

ぐらいなら構文解析をちゃんと作ればOKです。
構文解析か。やっぱりここに行きつくか。。。
なんとなくわかっていたような。
未知の世界なので。

トークンに分けて・・・のーみそばーん。
チャレンジしがいがありそうです。
気のきいたライブラリがあればと。
softya(ソフト屋) さんが書きました:ただ、結局データの打ち込みと後々の修正・チェックしやすいと言う観点からするとExcelで入力してcsvとするのが一番多いパターンなのでは?
恐ろしいほどごもっともです。
csv出力は気づきませんでした。

このトピはすでに着地点についた気がしてきましたが、
csvならすでに考え付いていることなのです。
もうちょっと楽したい。さらなる妙案がございましたら。
不躾ながらご容赦を

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 16:27
by softya(ソフト屋)
ちなみにExcelのVBAで加工出力するならバイナリファイルを作ることもできます。
あるいは、テキスト→perl(構文解析・整形)→C言語(入力のみ)って方法もあります。

C言語で字句・構文解析するならyacc/lexが定番ですね。

【補足】
構文解析する参考

「Cプログラミング講座第3回「数式の構文解析」」
http://www.wakayama-u.ac.jp/~takehiko/h ... arsing.htm
「プログラム言語を作る! - Part1 誰でも作れるプログラム言語:ITpro」
http://itpro.nikkeibp.co.jp/article/COL ... 248581/?k2
「C言語-目次」
http://masudahp.web.fc2.com/cl/
「プログラミング言語を作る」
http://kmaebashi.com/programmer/devlang/index.html

Re: 解析入力テキストファイルの読み込み方

Posted: 2013年5月18日(土) 16:55
by むら
構文解析する参考文献のご提示ありがとうございます。

めがぐるぐるしています。
コードを参考にトークンに分けて先頭の記号により
スイッチで読み込む形式でやってみます。

簡単なものはないってことで了解しました。