- 締切済み
Cでデータ入力
研究でシミュレーションを使っているのですが、全対象を1度にシミュレーションすることはメモリの関係上無理なので、分割して行っています。 1段階目のシミュレーション結果を次のシミュレーションに入力させる必要があるのですが、毎回自分で入力するのは非常に手間がかかるので、プログラムで自動的に入力させようとしています。 シミュレーション結果のフィールドデータをプログラムで自動的に次のシミュレーションソフトに入力させるプログラムをお詳しい方教えていただけないでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
>全対象を1度にシミュレーションすることはメモリの関係上無理なので、分割して行っています。 メモリ一杯使ってシミュレーションを行っているとのことで、境界値を一度ファイルに落とすしか手段はないように思います。 回答例は、バッチファイルを作るのではなく、プログラム自体が計算終了結果を一度ファイルに落とし、次にこのファイルを読んで計算を続けるようなプログラムに適用できるように、ファイルに番号を付けながら処理を継続する内容としてみました。 たとえば、最初の処理が終わったら、格納ファイル名を聞いてきますので仮に file という名のファイルとすると Base data file name? file file0 というファイル名で内容を書き込み 再処理ではそのファイルを読み込んで Read file: This file code No.0 処理を続け、これを3回繰り返して、file0, file1, file2 の3つのデータファイルを自動的に作成し、読み込むプログラム例です。 /* --- 実行結果 --- Job 0 Base data file name? file Write data: This file code No.0 Read file: This file code No.0 Job 1 Write data: This file code No.1 Read file: This file code No.1 Job 2 Write data: This file code No.2 file0, file1, file2 のデータファイルが自動生成される。 */ #include <stdio.h> #include <stdlib.h> //exit() #include <string.h> //strtok() #define SIZE 256 void _read_write(int n, char *mode, char work[]); int main(void){ char work[SIZE]; char check[8]; int n=0; /* ループ回数はきちんと変更のこと */ while(n < 3){ /* 2回目からはデータファイルを読み込み */ if(n > 0){ _read_write(n, "r", work); /* 境界値を割り振る */ printf("Read file: %s", work); } /* アッという間に終わるので確認を挿入した。単に return キーを押すこと */ printf("Job %d ", n); fgets(check, 7, stdin); /********* ここにシミュレーションプログラムを置く *********/ /* 境界値を書き込む */ _read_write(n, "w", work); /* 繰り返し回数をカウント */ n++; } return 0; } void _read_write(int n, char *mode, char work[]){ FILE *fp; static char base_file[128], file_name[128]; /* w writeの書き込みモード */ if(*mode == 'w'){ /* 最初はファイル名を決める */ if(n == 0){ printf("Base data file name? "); fgets(base_file, SIZE, stdin); strtok(base_file, "\n"); } /* 正式ファイル名は、「ファイル名+n」 */ sprintf(file_name, "%s%d", base_file, n); if((fp = fopen(file_name, "wb")) == NULL){ perror("fopen"); exit(EXIT_FAILURE); } printf("Write data: This file code No.%d\n", n); /********* ここに引き継ぎのデータを書着込む **********/ fprintf(fp, "This file code No.%d\n", n); fclose(fp); /* r readの読み込みモード */ } else { /* 正式ファイル名は、「ファイル名+ (n-1) 」 */ sprintf(file_name, "%s%d", base_file, n - 1); /* 直ぐ前のデータファイルをオープンする */ if((fp = fopen(file_name, "r")) == NULL){ perror("fopen"); exit(EXIT_FAILURE); } /****** ここに境界値を読み込む ******/ fgets(work, SIZE, fp); fclose(fp); } }
- kmee
- ベストアンサー率55% (1857/3366)
その手入力の方法しだいでは、キーボードで入力するそのままのテキストファイルになるよう加工して、それをリダイレクトで喰わせるだけで済むような。 (入力がscanfだのfgetsだのでstdinから読んでいる場合) その辺りも補足してもらえれば、より詳しく説明できるかも。
- tatsu99
- ベストアンサー率52% (391/751)
もっともてっと早い方法は、シミュレーション結果のフィールドデータをファイルへ出力し、 次のシミュレーションソフトでそれを読み込むようにすることでしょう。 但し、ファイルへ書き込む方法として、#1の方が言われているように、 1.CSV形式のファイルにする方法と 2.バイナリーデータにする方法があります。 1の利点は、出力結果を直接、人間が参照できること、と、一部の都合の悪い結果を、人間が簡単に修正し、次のプログラムにひきわたせることです。欠点は、プログラムが複雑になることです。(CSVファイルの読み書きを一から作るとかなり大変です。) 2の利点は、ファイルに出力し、ファイルから読み込む部分を簡単に作れることです。 出力データの全てを構造体(又は配列)に格納し、一気に書き込みます。読み込みも同様に一気に読み込みます。その際、そのファイル名を各シミュレーションプログラムの起動パラメータとして与えるようにすれば、使いかっても良くなるでしょう。欠点は、そのファイルはバイナリーデータのため、人間が簡単に確認したり、修正することができないことです。(バイナリーエディタを使用すればできないことはありませんが・・・) 上記の記述で意味不明の点があれば、補足してください。その場合、OS(windows-7,linux等)も補足してください。
補足
C言語やバッチファイルなどの知識がないので勉強中ですが、 使っているシミュレーションがフィールドデータでないと入力として受け付けてくれないので、 できればフィールドデータのままで次へ渡したいです。 説明が足りなかったのですが、シミュレーションソフトの画面上で、 1.入力データを設定する画面を開く 2.前の段階のシミュレーション結果の(フィールド)データを選択する 3.シミュレーションを開始させる という流れを自動でやってくれるマクロの様なものを考えています。 OSは7です。
- edomin7777
- ベストアンサー率40% (711/1750)
「パイプ」にするとか、「csv形式」で保存・読み込みをさせるとか? OSも環境も書いていないので、何とも言えませんね。
お礼
ありがとうございます^^ これを参考にうまくシミュレーションが連続で実行されるように頑張ってみます。
補足
ここに引き継ぎデータを書き込む ここに境界値を読み込む とありますが、この部分をもう少し具体的に教えていただけないでしょうか?><