質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

6回答

1031閲覧

Cのソースコード中の数値変更を、手入力ではなく自動で行いたい。

Miguel211

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/07/11 11:41

編集2021/07/11 12:54

前提・実現したいこと

学生です。大学の研究で、C言語の、ソースコード中の数値を少しずつ変えて、計算し、その計算結果を解析しています。例えば、ソースコード中の変数やファイル名を、1000から2000まで、変数を1000、1001、1002、、、、のように手入力を行い、新規ファイルを一つずつ作成しています。研究で変更する例(500を501、502、、、のように、1000を1001、1002、、のように変更)をソースコードにて書いていますのでご覧ください。

手持ちのPCでterapadで作成したCファイルを、SCPでファイル共有し、teratermから、大学のコンピュータにて、Cファイルのコンパイル、実行を行っています。計算結果は、mathematica等で様々なパラメータにより解析を行います。

手持ちのPCの動作環境はCPUが八世代のcorei7と、8ギガのメモリです。これで、Cファイルの作成を行っています。

繰り返すようですが、変数が1000のCファイルを開き、数値を手入力で変更(1000→1001のように)して、名前を付けて保存。という作業を延々と行っています。C言語は研究室に入ってから勉強していますが、まだ日が浅いです。
そのため、少しでも、手入力の工程を短くしようと思い、調べているのですが、よい調べ方が分からず、質問させていただきました。

解決できるようなCの書き方、もしくは、自動的にソースコードを変更していけるツールなど、使えそうなものはありますでしょうか。

みなさまのご助力をいただきたく思っています。宜しくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <math.h> #define D 500//ここの数値を50、5000などと手入力で変更したり、 double I=1000;//ここの数値を1000,1001,1002,,などと手入力で変更しています。 long IRND[251]; long IFORM1,IFORM2; long P[25][13]; int S[N+2][M+2][L+2]; FILE *fp0; char *file0="〇〇500〇〇〇〇1000.dat";//変更した数値に合わせて、ファイル名も手入力で変えています。 FILE *fr0,; char *read_fileABC="〇〇500〇〇〇〇1000.dat";//変更した数値に合わせて、ファイル名も手入力で変えています。 FILE *fa0; char *add_file0="〇〇500〇〇〇〇1000.dat";//変更した数値に合わせて、ファイル名も手入力で変えています。 //以上の手入力での変更を行っています。この手入力で行う操作を、減らしたり、一括で行えるようなコード、またはツールなどありますでしょうか。ここまで書けばよいかとは思うのですが、以下、ソースコードの書き足す必要がありましたら、ご助言宜しくお願いします。

試したこと

C言語の教科書、インターネットでの検索

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/07/11 12:00

コードはこれで全部? 目的がわかれば、また違ったアドバイスもあるかも。 あと、動作環境もあるといいので追加しましょう。
Miguel211

2021/07/11 12:08

ご助言くださり、感謝です。コードや、動作環境等、追加させていただきます。
Miguel211

2021/07/11 12:55

追加して見づらくなったかもしれませんが、質問を編集したので確認いただければ幸いです。
guest

回答6

0

ベストアンサー

こういう感じです。

shell

1$ cat sample.c 2#include <stdio.h> 3#include <stdlib.h> 4#include <math.h> 5 6#define BUFSIZE 100 7 8int main(int argc, char *argv[]) { 9 char *D_str, *I_str; 10 int D, I; 11 char file0[BUFSIZE], read_fileABC[BUFSIZE], add_file0[BUFSIZE]; 12 FILE *fp0, *fr0, *fa0; 13 14 D_str = argv[1]; 15 I_str = argv[2]; 16 D = atoi(D_str); 17 I = atoi(I_str); 18 19 sprintf(file0, "FF%sGGGG%s.dat", D_str, I_str); 20 sprintf(read_fileABC, "RR%sSSSS%s.dat", D_str, I_str); 21 sprintf(add_file0, "AA%sBBBB%s.dat", D_str, I_str); 22 23 printf("file0 is %s\n", file0); 24 printf("read_fileABC is %s\n", read_fileABC); 25 printf("add_file0 is %s\n", add_file0); 26} 27 28$ gcc -o sample sample.c 29$ ./sample 500 1000 30file0 is FF500GGGG1000.dat 31read_fileABC is RR500SSSS1000.dat 32add_file0 is AA500BBBB1000.dat 33$ ./sample 600 1001 34file0 is FF600GGGG1001.dat 35read_fileABC is RR600SSSS1001.dat 36add_file0 is AA600BBBB1001.dat

投稿2021/07/11 17:51

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

案1:
コンパイル時にオプションで与える。
ソースから、#define A 1000を削除して、コンパイルオプションで-DA=1000を指定する。

案2:
起動時のコマンドラインで与える。
int main(int argc, char **argv){の、argcargvを使ってコマンドラインを参照する。

C

1int A; 2if(argc>1) { 3 A = atoi(argv[1]); 4}else{ 5 エラー 6}

案3:
ファイルに書いておいて、読む。
(略)

どれでも良いですが、
int xxx[A];のように変数宣言の配列サイズに使うなら、案1ですね。

投稿2021/07/11 12:57

otn

総合スコア85849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miguel211

2021/07/11 13:10

ご回答ありがとうございます。案1を採用させて頂こうかと思いますが、たとえば、DA=1001としたら、 FILE *fp0; char *file0="〇〇〇〇〇〇〇〇1001.dat"; のように、出力のファイル名にも、コンパイルオプションで変更した値を反映させられるのでしょうか。 素人質問で申し訳ないのですが、教えていただければ幸いです。
otn

2021/07/11 15:52

コンパイルオプションで、「-DA=1001」と指定すると、 #define A 1001 と同等です。
guest

0

よくある方法としては、

  1. プログラム起動時の引数で与える。

C

1int main(int argc, char *argv[]) 2{ 3 int num = atoi(argv[1]); 4 5  // .. 以下、略 6}

で、
> test 1000 とかで起動する。

  1. ファイルに入力数字のリストを用意し、それを読み込ませる。

既に、ファイルへの書き込みを行っているようなので、その逆。
(詳細、略...)

といったところ。

投稿2021/07/11 11:51

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miguel211

2021/07/11 12:56

早速のご回答ありがとうございました。質問内容を編集しましたので、それと回答があっているか、確認いただければ、幸いです。
pepperleaf

2021/07/12 11:34

ppaulさんが、既に回答してますね。 そんなところでしょうか。
guest

0

目的がわからないけど、同じソースファイル名であるときはこれまで回答された方々の方法がいい。別ファイルでもいいならソースファイルそのものを別ツールで変更後保存という手もあり。的外れ回答なら失礼。

投稿2021/07/14 02:46

kahki

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一応、コンパイルオプションとプリプロセッサマクロを用いた場合は

c

1#include <stdio.h> 2 3#define NAME_(a, b, d, i) #a #d #b #i ".dat" 4#define NAME(a, b, d, i) NAME_(a, b, d, i) 5#define NAME0 NAME(〇〇, 〇〇〇〇, D, I) 6 7const char* name0 = NAME0; 8int main() 9{ 10 puts(name0); 11}

gcc program.c -DD=500 -DI=1000とする事が可能です。

正直読んでてつらいしsnprintf使った方が保守は楽でしょう。

投稿2021/07/12 12:10

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

処理をfor文で囲み、好きなだけ繰り返せばいいのでは?

c

1for(i=1000; i<1000000; i++) { 2 double aa = i; 3 FILE *fp0 4 char *file0="〇〇〇〇〇〇1000.dat";

for文でファイル名も変えられますでしょうか。なかなかうまくいかないのです。

c

1for(i=1000; i<1000000; i++) { 2 double aa = i; 3 FILE *fp0 4 char file0[256]; 5 sprintf(file0, "〇〇〇〇〇〇%d.dat", i);

投稿2021/07/11 11:51

編集2021/07/12 12:08
shiketa

総合スコア4052

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miguel211

2021/07/11 12:58

ご回答ありがとうございます。for文でファイル名も変えられますでしょうか。なかなかうまくいかないのです。質問内容も、編集しなおしましたので、確認いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問