• ベストアンサー

ファイルの中身を分割するプログラムを作りたい

Microsoft Visual C++ 6.0を使用してプログラムを作っているのですがうまくいきません。 作成しようとしているプログラムは、三角形の各座標(x,y,z)が示してあるファイルを入力させ、 その三角形を四分割した座標値を示したものを違うファイルに出力させるというプログラムなのですが・・・ (イメージとしては三角形の各辺の中点を頂点にとってそれぞれをつなげて四つの三角形を作る感じです。) 説明不足ですが、分かる方がいられましたらぜひご教授をお願いします。

  • Nokey
  • お礼率100% (9/9)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

fgetsで一行入力して sscanfなどで変数へ取り込めばいいように思います char sbuf[256] fgetg( sbuf, sizeof( sbuf ), fp ); sscanf( sbuf, "%lf %lf %lf", &x, &y, &z ); # テキストファイルからの入力ならほとんどのC言語の参考書に載っているかと

Nokey
質問者

お礼

回答ありがとうございます。 テキストファイルを読み直して 無事プログラムを作ることが出来ました。 このような質問に丁寧に回答していただき 本当にありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どこまで出来ているのでしょう? 『すべて説明しろ』はちょっと無理ですよ プログラミングの形態 Win32APIとか MFCやSTLなど どれを使っているとか ファイルの読み込み部分は出来ているとか 出力形態はこのようにするなど   元データと、新規データの出力位置関係など 具体的に不明な部分を絞りましょう 中点自体は2頂点からなる線分のX成分(またはy成分)の半分を始点座標にベクトル(方向)を考慮して加算すれば算出できます

Nokey
質問者

お礼

回答ありがとうございます。 説明不十分で申し訳ありません。 プログラミングの形態?というのははかりかねますが 入力ファイルはstlのデータを簡略したもので 三角形の数・各三角形の座標が示してあるファイルです。 進捗状況としては大方骨組みは出来ていると思うのですが… 不明な点としては、出力ファイルを新規ファイルで作るには どうしたらいいか? あと、根本的なのですが入力ファイルの中の各座標の値を 変数に割り当てたいのですがやり方がわかりません。 こんなファイル↓     -2.170831 -1.577194 1.341639 -2.683278 0.000000 -1.341639 -0.829180 -2.551945 -1.341639 の値ををそれぞれ、例えばx,y,zに割り当てたいのですが…

関連するQ&A

  • 3d 法線ベクトル計算 

    3dのポリゴンの法線ベクトルを算出するプログラムなんですが 以下のプログラムに間違っている部分はあるでしょうか 何度か試してみたのですが何度か0で除算したりしてしまいます 渡す数字が悪いのか、プログラム自体が間違っているのかわかりません 少し助けてください //法線ベクトル計算開始 x1=1つめの頂点のx座標 y1=1つめの頂点のy座標 z1=1つめの頂点のz座標 x2=2つめの頂点のx座標 y2=2つめの頂点のy座標 z2=2つめの頂点のz座標 x3=3つめの頂点のx座標 y3=3つめの頂点のy座標 z3=3つめの頂点のz座標 x4=x2-x1 y4=y2-y1 z4=z2-z1 x5=x3-x1 y5=y3-y1 z5=z3-z1 x6=y4*z5-y5*z4 y6=x4*z5-x5*z4 z6=x4*y5-x5*y4 //正規化 er=sqrt(x6*x6+y6*y6+z6*z6) x6=er*x6 y6=er*y6 z6=er*z6 //終わり /法線ベクトル計算

  • プログラム ファイル処理について

    プログラムの問題が解けなくて困っています。 visual C++ 2010 Express を使用しています。 (1)X,Yの範囲がそれぞれ-200から200の範囲で空間内に立体が書かれる ようにエクセルファイルにデータを入れたいのですが、その処理がうまくいきません。 (2)degreeの意味がわかりません。degree*PI(円周率)/180でradianなのですか? よろしくお願いします。 今、2次元平面上の座標値(x,y)に対し、(x2+y2)0.5を角度(degree) とした場合に、 下記の式によって定義されるポテンシャル値zの分布を考える z=30×(cos(√(x2+y2))+cos((3×√(x2+y2))) xとyの範囲を(-200<X<200)、(-200<Y<200)と設定してXとYの値を10ごとに増加させた場合のZの値を 以下のようなfor文を用いて計算し、 for(y=200.0;y>=-200.0;y=y-10.0){  for(x=-200.0;x<=200.0;x=x+10.0){  } } 同一のY座標値におけるZの値がカンマで区切られて並ぶテキストファイルを出力するプログラムを作成しなさい。 そのファイルをエクセルで開き(カンマ区切りで) 3次元グラフを表示させる. ヒント1: #include <math.h> を宣言することにより、数学関数 cos sin pow が使用可能となる。 ヒント2: sin cos の引数はラジアン単位で指定する必要があるため、円周率を用いて degree から radian を求めること

  • プログラムの練習問題

    プログラムの練習問題が解けなくて困っています。 visual C++ 2010 Express を使用しています。よろしくお願いします。 今、2次元平面上の座標値(x,y)に対し、(x2+y2)0.5を角度(degree) とした場合に、 下記の式によって定義されるポテンシャル値zの分布を考える z=30×(cos((x2+y2)0.5)+cos((3×(x2+y2)0.5)) xとyの範囲を(-200<X<200)、(-200<Y<200)と設定してXとYの値を10ごとに増加させた場合のZの値を 以下のようなfor文を用いて計算し、 for(y=200.0;y>=-200.0;y=y-10.0){ for(x=-200.0;x<=200.0;x=x+10.0){ } } 同一のY座標値におけるZの値がカンマで区切られて並ぶテキストファイルを出力するプログラムを作成しなさい。 そのファイルをエクセルで開き(カンマ区切りで) 3次元グラフを表示させる. ヒント1: #include <math.h> を宣言することにより、数学関数 cos sin pow が使用可能となる。 ヒント2: sin cos の引数はラジアン単位で指定する必要があるため、円周率を用いて degree から radian を求めること。

  • C++ファイルからデータ入力して計算、ファイル出力

    C++初心者です。 ファイルの数値データを入力して、それらを計算してからファイルに出力する方法がわかりません。 たとえば、 入力ファイル   出力ファイル 行数  x y z (1)  1 1 6   y(1)*exp(z(1)-x(1))+y(2)*exp(z(2)-x(1))+... (2)  3 5 2   y(1)*exp(z(1)-x(2))+y(2)*exp(z(2)-x(2))+... (3)  5 6 9  y(1)*exp(z(1)-x(3))+y(2)*exp(z(2)-x(3))+... (4)  9 1 3   y(1)*exp(z(1)-x(4))+y(2)*exp(z(2)-x(4))+… (5)  1 7 8   y(1)*exp(z(1)-x(5))+y(2)*exp(z(2)-x(5))+... 入力したデータを上記のように計算してから出力ファイルにしたいのですが、複雑なのでプログラムをどう組み立てれば良いのかわかりません。 ちょっとしたことでも結構です、参考になりそうなサイトや、ロジック、プログラムに関するアドバイスいただけませんか。

  • Fortranで出力したファイルの内容を並べ替えたいです

    いま、Fortranをつかって統計物理の解析を行っています。計算結果は --- 時刻T1 AのX座標 AのY座標 AのZ座標 BのX座標 ・・・ 時刻T2 AのX座標 AのY座標 AのZ座標 BのX座標 ・・・ ・ ・ ・ --- という具合に出力されるのですが、この形式では都合が悪いことがあって --- A T1 X Y Z T2 X Y Z ・ ・ ・ B T1 X Y Z T2 X Y Z ・ ・ ・ C --- と言う感じに出力したいのですが、それぞれの物体が独立して運動するわけではないので、どうしても上の形式で一度出力してからほしい形式に変換しなればなりません。私はFortranしか使ったことがないのでできればFortranで並び替えを行いたいのですが、このようなことがFortranでできますか?また、Fortranでこのような並び替えをするにはどうすれば良いのでしょうか。御教授よろしくお願いします。

  • 分割されたデータの中身

    お初にお目にかかります。 なんとなくふっと疑問に思ったことがあったので質問させて頂きます。 例えば、テキストファイルなどを ファイル分割ソフトでふたつに分割した時、 その一方だけから、テキストファイルの中身を 解析または予測することは可能でしょうか? 「となりのきゃくは よくかきくうきゃくだ」 馬鹿らしいかもしれませんが、 ↑のようなテキストだけ入ったファイルをふたつに分割した後、 その一方を解析すると「となりのきゃくは」 というテキストが入ってることはわかるのか? というような。 それともうひとつ。 複数のファイルをふたつずつに分割した後、 そのひとつひとつが、どのファイルの片割れか 判別する方法はあるでしょうか? 例えばAとBというファイルをふたつずつに分割し、 w、x、y、zという分割ファイルができたとして、 wの相方はどれ、xの相方はどれという風に 分割ファイルそのものを解析したり 何らかの方法で判別できるか? というような。 PC初心者がなんとなくふっと疑問に思っただけですので、 お暇な時にでもエキスパートな方からのご解答お待ちしてます。

  • 整数格子点を列挙するプログラム

    『座標上に(0,0),(x,0),(0,y)を頂点とする直角三角形を考え、 xとy(整数)をキーボード上から任意に入力した場合に、 その境界線上も含む整数の格子点を例のように表示する プログラミングを作成せよ。』という問題です。 入力例:(xに3,yに4をキーボード上から入力) > Input x : 3 > Input y : 4 出力例:(入力した整数に応じて以下のように出力) > (0,4) > (0,3) > (0,2) (1,2) > (0,1) (1,1) (1,2) > (0,0) (1,0) (2,0) (3,0) for文を使うと思うのですが、どのようなプログラムを作ればいいのか分らないので、教えてください。

  • C++のプログラムが走りません。

    <<条件は以下です。>> データメンバ x:xの座標(ただし 0-1000とする) y:yの座標(ただし 0-1000とする) z:zの座標(ただし 0-1000とする) メンバ関数 void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する) void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する) void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する) int getX(): Xの座標値を得る int getY(): Yの座標値を得る int getZ(): Zの座標値を得る << 不明な点は、 if文で、どう戻るかがわからないことと、 最後の結果表示の部分です。 以下が、作成したプログラムです。ネットで検索して類似しているプログラムを参考にしたんですが。 よろしくお願いします。>> #include <iostream> using namespace std; class Zahyou{ private: int getX();//Xの座標値を得る int getY();//Yの座標値を得る int getZ();//Zの座標値を得る int a,b,c; public: void setX(int a);//Xの座標を設計する void setY(int b);//Yの座標を設計する void setZ(int c);//Zの座標を設計する void show(); }; void Zahyou::show(){ cout << "The result is: (" << a << "," << b << "," << c << ")"; } void Zahyou::setX(int a){ cout << " Please Input X " << "\n "; cin >> a ; if(a < 0 && a > 1000){ cout << "The value of X is a mistake, Please input X again! " << " \n "; } } void Zahyou::setY(int b){ cout << "Please Input Y " << "\n "; cin >> b ; if(b < 0 && b > 1000){ cout << "The value of y is a mistake, Please input X again! " << " \n "; cin >> b ; } } void Zahyou::setZ(int c){ cout << " Please Input Z " << "\n "; cin >> c ; if(c < 0 && c > 1000){ cout << "The value of Z is a mistake, Please input X again! " << " \n "; cin >> c ; } } int main(){ Zahyou zahyou1; zahyou1.getX(); zahyou1.getY(); zahyou1.getZ(); zahyou1.show(); return 0; }

  • 3次元座標の求め方

    3次元座標の求め方 原点 0,0,0 を中心にした球体面上の正面から見た頂点座標で、 回転による移動後の座標の求め方を知りたいです。 例えば、球面の半径が 100 で、頂点の座標 x1, y1, z1 が 100, 0, 0 にある場合、 Y軸に対してπ/2 rad (90度)回転した座標 x2, y2, z2 は 0, 0, -100 になると思うのですが、 この新たな3つの座標 x2, y2, z2 を導くにはどのように計算しているのでしょうか。 平面上の円運動のように cos sin の組み合わせ等で導き出せるのでしょうか。 x1, y1, z1 から、 Y軸に対してr回転 した場合の各 x2, y2, z3 の出し方 X軸に対してθ回転 した場合の各 x3, y3, z3の出し方 Z軸に対してΘ回転 した場合の各 x4, y4, z4 の出し方 のような形で、導くための計算を順にお教えいただけると嬉しいです。 最終的には、元座標 x, y, z をY軸にr、更にそこからX軸にθ、更にそこからZ軸にΘで X, Y, Z になる、といった形で求められるようになりたいと思っています。 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています 自分のわかる限りで質問内容を細かく記述したつもりですが、 数学の知識に乏しいので、記号などの使い方や説明の不備があるかもしれません。 何か不足があった場合には補足させて頂きます。 以上宜しくお願い致します。

  • DirectXで曲面の描画

    DirectX9で曲面の描画を考えています。 x=0.0~10.0、y=0.0~10.0、z=exp(-x^2-y^2)といった座標を与えて、 波を打つような曲面を作成したいのですが (QNo.2528542のような滑らかな曲面でなくてもよいです) 自分でメッシュを作成することで実現可能なのでしょうか? メッシュを作成するには頂点(バッファ)を指定するの思うのですが、 その頂点は射影行列を施した後の(x座標、y座標、Z値)になり、 上のような3次元空間上の座標から直接メッシュが作り出せないものかと考えています。 ティーポットのようなメッシュをXファイルを使わずに作り出すにはどうしたらよろしいでしょうか? (↑曲面の描画 イコール メッシュの作成と考えての質問です、そもそもこの思考が間違っていますか?) だらだらと書き綴りましたがよろしくお願いします。

専門家に質問してみよう