🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

4回答

4843閲覧

コマンドライン引数でtextファイルの名前を入れて、読ませたい

ys003

総合スコア1

C

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/01/20 20:36

編集2021/01/20 22:44

前提・実現したいこと

コマンドライン引数で C:\sample11-1.txt を読ませて、計算をさせたい

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

``
アドバイスをくださった方々ありがとうございます
gcc ファイル名.c でコンパイルすると無事にコンパイルできて、
./a.exe C:sample11-1.txt
と打ったのですが反応がありません
(何も表示せずにプログラムが終わってしまっています)
コマンドライン引数でもらったデータをcharに変換することができていないのかもと思いますが調べてもよく分かりませんでした。

該当のソースコード

c言語

1ソースコード 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5#define MAX_DATA 1000 6 7int main(int argc, char *argv) { 8 if (argc != 2) { printf("使用法: %s <文字列>\n", argv[0]); return 1; } 9 10 char buf[256]; double weight[5]; double sum; int i, n; sum = 0; 11 FILE *fp; 12 char *filename; 13 *filename = argv[1]; 14 fp = fopen(filename, "r"); 15 if (fp == NULL) { printf("ファイル%sが開けません.\n", filename); return 1; } //ファイルオープンのエラー 16 for (n = 0; n < MAX_DATA; n++) { 17 if (fgets(buf, 256, fp) == NULL) break; 18 weight[n] = atof(buf); 19 sum += weight[n]; 20 } 21 fclose(fp); 22 printf("平均 = %5.1lf\n", sum/5); 23 return 0; 24}

試したこと

./a.exe C:\sample11-1.txt で打ちました

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

Visual studio code を使っています。

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

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

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

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

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

hoshi-takanori

2021/01/20 20:42

質問は編集できますので、ソースコードを貼ってくれないと何とも言えません。
takasima20

2021/01/20 21:29

それ gcc が所定のファイル名以外を指定したときに出すエラーメッセージじゃ?
takasima20

2021/01/20 22:09

あー、やっぱコンパイル時に指定してたか。 コンパイルしてできた実行ファイルに指定しましょう。 インタープリタあたりと混同してるのかな?
guest

回答4

0

*filename = argv[1];

filename = argv[1];
に修正しましょう。

argv[1]は文字列の先頭アドレスなので、それを代入するのは*filenameではなく、filenameです。

初期化されていないfilenameを使って、*filenameに代入しようとすると、セグメンテーションフォールトしたりします。

投稿2021/01/21 02:37

ppaul

総合スコア24670

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

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

0

ベストアンサー

引数は入力できたと思うのですが、実行しても何も起こりませんでした。

手元の環境(Linux)では異常終了のメッセージが出ましたが、Windowsでは何のメッセージ等も出ないんですか?

Segmentation fault (コアダンプ)

どんな処理をさせたいのかこちらでもちょっと把握しきれていない部分もあるかもしれませんが、
指定されたテキストファイルに書かれている5つの数字の平均値を求めるということなら次のような修正になります。(追記:コメントでのご指摘を受けてソースコード修正しました。)

  • main()関数のargvの型がおかしいのを修正した。同時にargvの使用箇所も修正した。
  • データ数として「MAX_DATA」を使うように統一した

diff

1--- hogeorg.c 2021-01-21 07:56:34.256784888 +0900 2+++ hoge.c 2021-01-21 10:36:44.730806905 +0900 3@@ -1,15 +1,15 @@ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7-#define MAX_DATA 1000 8+#define MAX_DATA 5 9 10-int main(int argc, char *argv) { 11+int main(int argc, char *argv[]) { 12 if (argc != 2) { printf("使用法: %s <文字列>\n", argv[0]); return 1; } 13 14- char buf[256]; double weight[5]; double sum; int i, n; sum = 0; 15+ char buf[256]; double weight[MAX_DATA]; double sum; int i, n; sum = 0; 16 FILE *fp; 17 char *filename; 18- *filename = argv[1]; 19+ filename = argv[1]; 20 fp = fopen(filename, "r"); 21 if (fp == NULL) { printf("ファイル%sが開けません.\n", filename); return 1; } //ファイルオープンのエラー 22 for (n = 0; n < MAX_DATA; n++) { 23@@ -18,6 +18,11 @@ 24 sum += weight[n]; 25 } 26 fclose(fp); 27- printf("平均 = %5.1lf\n", sum/5); 28+ if ( n == 0 ) { 29+ printf("データ数が0なので平均の計算はしません\n"); 30+ } 31+ else { 32+ printf("平均 = %5.1lf\n", sum/n); 33+ } 34 return 0; 35 }

投稿2021/01/20 23:27

編集2021/01/21 01:45
hidezzz

総合スコア1248

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

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

tatsu99

2021/01/21 01:29

平均は、読み込んだデータの件数で割るべきかと思います。
hidezzz

2021/01/21 01:43

ご指摘ありがとうございます。おっしゃる通りですね。 MAX_DATAでなく「n」で割るように回答のソースコードを修正しました。
ys003

2021/01/23 14:41

返信遅れてしまい申し訳ありません 回答ありがとうございました
guest

0

gcc ファイル名.c C:\sample11-1.txt と打ちましたが

gcc ファイル名.c

で実行ファイル a.exe が生成されたら

.\a.exe C:\sample11-1.txt

投稿2021/01/20 21:57

episteme

総合スコア16612

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

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

0

C:\sample11-1.txt

といれてみてはどうでしょう。
これでダメなら、コードを提示しましょう

投稿2021/01/20 21:36

y_waiwai

総合スコア88038

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

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

ys003

2021/01/20 21:51

回答ありがとうございます。 ターミナルに gcc ファイル名.c sample11-1.txt と入力したのですがダメでした。 コードを乗せたのでもしよろしければ教えていただけると助かります
y_waiwai

2021/01/20 21:54

そこに入れるもんじゃありません。根本的にやり方間違ってます コンパイル結果のEXEファイルを実行するときに入れましょう
ys003

2021/01/20 22:49

理解が足りていなかったみたいです。 C:sample11-1.txtと打つときはわかりました。 ありがとうございます。 引数は入力できたと思うのですが、実行しても何も起こりませんでした。 恐らく私の書いたプログラム(特にargvとかのあたり)がおかしいと思うのですが調べても分からなかったのでよろしければ教えていただきたいです
y_waiwai

2021/01/20 23:26

コード自体はおかしなところはなさそうなので、ちゃんとコンパイルできてるのかを確かめてみては
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問