datファイル作成方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mkai

datファイル作成方法

#1

投稿記事 by mkai » 6年前

以下のプログラムの計算結果(u[k][n])をdatファイルに打ち出しwgnuplotでデータを図示したいのですがどのようにdatファイルを作るのかよく分かりません。

どのようなコードを書けば良いのでしょうか?よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define M 4
#define N 100
#define delta 1.0

int main(){
int i,j,k,n;
int b[M][M] = {0};
double u[2*M+1][N];
for(i=0;i<M;i++){
	b[i][i]=1;
}
for(i=0;i<M-1;i++){
	b[i][i+1]=1;
}

for(n=0;n<N;n++){
	u[0][n]=0;
	u[2*M][n]=0;
}

for(k=1;k<2*M;k++){
	u[k][0] = 1.0/(1+u[k-1][0]);
}
for(n=0;n<N-1;n++){
	for(k=1;k<2*M;k++){
		u[k][n+1] = (u[k][n]*(1+delta*u[k+1][n])) / (1+delta*u[k-1][n+1]);
	}
}

for(n=0;n<N;n++){
	for(k=1;k<2*M;k++){
		u[k][n] = sqrt(u[k][n]);
	}
}

for(n=0;n<N;n++){
		for(k=0;k<M;k++){
			printf("%.9f ",u[2*k+1][n]);
		}
	printf("\n");
}
return 0;
}

びぎなぁ

Re: datファイル作成方法

#2

投稿記事 by びぎなぁ » 6年前

wgnuplotが読み込むデータの形式がどのようになっているかをまず調べなければなりません。

ファイルを作ること自体はfopenやfwriteなどの関数を使ってやればよいでしょう。

コード:

//======================================
// テキストファイルの作成
//======================================
#include <stdio.h>
#include <string.h>

int main(void){
	FILE *fp;
	char *str="Hello world";
	fopen_s(&fp, "test.txt", "w");
	if(fp==NULL){
        printf("ファイルオープンエラー\n");
        return 1;
    }
	fwrite(str, sizeof(char), strlen(str),fp);
	fclose(fp);
	return 0;
}

mkai

Re: datファイル作成方法

#3

投稿記事 by mkai » 6年前

あまり詳しくは分からないのですがwgnuplotはdatファイルを読み込んでグラフを作ってくれますのでexelのグラフと同じような感じで読み込む形式になってるのではないかと…
びぎなぁさんのプログラムと自分が調べたのを混ぜて見よう見まねで作って見ました。
下のコードをdouble u[2*M+1][N];の下に入れたのですが案の定datファイルは作れたもののdatファイルの中身はめちゃくちゃでした。u[][]の値が決まってる以降にこのプログラムを動かすとファイルポインタがおかしいと出てエラーになってしまいます。どうすればよいでしょうか…?

コード:

FILE *fp;
fp=fopen("text.dat", "w");
if(fp==NULL){
	printf("ファイルオープンエラー\n");
	return 1;
}
for(n=0;n<N;n++){
		for(k=0;k<M;k++){
			fprintf(fp,"%lf",u[2*k+1][n]);
		}
}
fclose(fp);

mkai

Re: datファイル作成方法

#4

投稿記事 by mkai » 6年前

あまり詳しくは分からないのですがwgnuplotはdatファイルを読み込んでグラフを作ってくれますのでexelのグラフと同じような感じで読み込む形式になってるのではないかと…
びぎなぁさんのプログラムと自分が調べたのを混ぜて見よう見まねで作って見ました。
下のコードをdouble u[2*M+1][N];の下に入れたのですが案の定datファイルは作れたもののdatファイルの中身はめちゃくちゃでした。(計算した値ではなく数字の羅列が出て来ました)
u[][]の値が決まってる以降にこのプログラムを動かすとファイルポインタがおかしいと出てエラーになってしまいます。どうすればよいでしょうか…?

コード:

FILE *fp;
fp=fopen("text.dat", "w");
if(fp==NULL){
	printf("ファイルオープンエラー\n");
	return 1;
}
for(n=0;n<N;n++){
		for(k=0;k<M;k++){
			fprintf(fp,"%lf",u[2*k+1][n]);
		}
}
fclose(fp);

アバター
usao
記事: 1547
登録日時: 6年前

Re: datファイル作成方法

#5

投稿記事 by usao » 6年前

まず,目的のファイルのフォーマットを調べることをしないのはなぜなのでしょうか?
gnuplotについて検索等すればすぐにわかるはずです.
(あなたのデータをどのような形でグラフ化したいのか?によって
 ファイルへの書き出し方が変わるはずですから,
 「目的に対する正しいフォーマット」はあなたにしか判断できません.)

#計算部コードを見ていませんが,出力方法を見る感じだとu[][]のうち,約半分は不要?

non
記事: 1097
登録日時: 8年前

Re: datファイル作成方法

#6

投稿記事 by non » 6年前

ただのスペース区切りのテキストファイルのようですね。

リダイレクトするだけでいいでしょう。
コマンドプロンプトから
プログラム名 >test.dat
non

mkai

Re: datファイル作成方法

#7

投稿記事 by mkai » 6年前

usaoさん
フォーマットとは書き出し方のことでしょうか?
でしたら
5 8 0 9
2 3 7 1
4 2 1 4

のように数字と数字の間に空白をいれて4つ数字ごとに数字を書き出して欲しいです.
グラフは縦軸で縦の数字の変化を、横軸はforの回数ごとに打ち出したいです。
u[][]の半分は計算には必要ですが表にはする必要はないので偶数番を飛ばしています。

nonさん
コマンドプロンプトから行ったのですが数字に変化がありませんでした…

non
記事: 1097
登録日時: 8年前

Re: datファイル作成方法

#8

投稿記事 by non » 6年前

mkai さんが書きました:nonさん
コマンドプロンプトから行ったのですが数字に変化がありませんでした…
ごめんなさい。言っている意味がわかりません。
デスプレイに表示されている数値を、ファイルに出力したいということではなかったのですか?
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 8年前
住所: 東海地方
連絡を取る:

Re: datファイル作成方法

#9

投稿記事 by softya(ソフト屋) » 6年前

コマンドプロンプト上で表示されていないようがそのままファイルに出来るのがリダイレクトです。

 nonさんの書いたこれ。
  ↓
プログラム名 >test.dat

これで、出来たファイルで問題ないはずですが「数字に変化がありませんでした…」とはどんな意味でしょうか?
ファイルができませんでしたとか、意味不明ですなら返答として分かるんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mkai

Re: datファイル作成方法

#10

投稿記事 by mkai » 6年前

nonさん, softya(ソフト屋)さん

最初に初めのプログラム+.datファイルの作成コードをコンパイルするとtext.datファイルが作られました。
そのtext.datファイルの中身は実際に計算して出した値ではなくよくわからない数字の羅列でした。

コマンドプロンプトで表示された計算結果がそのままファイルに出力出来るのがリダイレクトと言うことですが、
新たにコマンドプロンプトを開き、上のプログラム名> text.datを行うと先ほどとは別の場所にtext.datファイルが生成されました。
最初に作られたdatファイルの中身はさっきと同じでよくわからない数字の羅列でした。(新しくdatファイルが生成された事に気づかず、最初のdatファイルだけを見て数字に変化がないと言いました;)
新しく生成されたdatファイルの中身は空っぽでした…

お二方の説明から計算結果を出力したコマンドプロンプトからリダイレクトを行うのだろうなとは思うのですが、visual c++で動かした後計算結果を表示したコマンドプロンプトは何かキーを押すと消えてしまうのですがどのようにして計算結果を表示した状態からリダイレクトをすれば良いのでしょうか…?

non
記事: 1097
登録日時: 8年前

Re: datファイル作成方法

#11

投稿記事 by non » 6年前

リダイレクトして実行するプログラムは、一番最初のプログラムです。fopenを付け加えたものではありません。
non

non
記事: 1097
登録日時: 8年前

Re: datファイル作成方法

#12

投稿記事 by non » 6年前

Visual C++をお使いのようですね。すると、EXEファイルの作り方も、コマンドプロンプトの出し方も知らないと思えます。

Visual C++なら次のようにしてみてください。

プログラムは、変更前の一番最初のもの
Visual C++の上にあるメニューから「プロジェクト」、一番下の「・・・・のプロパティ」
プロパティページが開くので、左側の構成プロパティを選択。
右側に「コマンド引数」ってのが出ますから、そこの空白に >test.dat って入力。
プロパティページを「OK」で閉じて
後は、いつものように「デバッグなし開始」
すると、コマンドプロンプトが出て、途中の計算結果が表示されなくなる。
コマンドプロンプトを閉じて、プログラムファイル(ソース)が保存されている場所に「test.dat」が作成されている。
プロパティページの「コマンド引数」は再び、空白にしておく。
non

mkai

Re: datファイル作成方法

#13

投稿記事 by mkai » 6年前

nonさん

コマンド引数は構成プロパティの中のデバッグと言う項目の中にあるやつですよね?
やってみたのですが計算結果は全て表示された上にdatファイルは生成されていませんでした…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 8年前
住所: 東海地方
連絡を取る:

Re: datファイル作成方法

#14

投稿記事 by softya(ソフト屋) » 6年前

mkai さんが書きました:nonさん

コマンド引数は構成プロパティの中のデバッグと言う項目の中にあるやつですよね?
やってみたのですが計算結果は全て表示された上にdatファイルは生成されていませんでした…
>test.dat
と半角で入力されましたか?
test.dat
だと生成されませんよ。

それとtest.datは何処に有ると思って探されていますか?
プロジェクトフォルダに出来るはずですので見当違いの場所の可能性があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mkai

Re: datファイル作成方法

#15

投稿記事 by mkai » 6年前

nonさん

出来ました!仰る通り「>」の記号が抜けていました;
ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る