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

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

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

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

Q&A

解決済

3回答

199閲覧

cのコマンドライン引数について

masuter0413

総合スコア50

C

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

0グッド

0クリップ

投稿2018/05/23 08:49

c言語でコマンドプロンプトで次のファイル
<cp pro3_5 - 1.txt>
//////////内容//////////////
a long time ago,
Therebwas alittle girl.
//////////////////////////
を指定して次のコードを実行したいです。

c

1#include <stdio.h> 2#include<string.h> 3 4int main(int argc, char *argv[]) 5{ 6 7 char ch; 8 FILE *fp; 9 if (argc != 2) { 10 printf("パラメータの数が違います。\n"); 11 return 1; 12 } 13 fp = fopen(argv[1], "r"); 14 if (fp == NULL) { 15 printf("ファイル名が不当です。\n"); 16 return 1; 17 } 18 while ((ch = fgetc(fp)) != EOF) { 19 putchar(ch); 20 } 21 22 fclose(fp); 23 return 0; 24} 25 26 27

visualStudioだと、コマンドプロンプトで簡単にファイル名を指定可能なのですが、現在、putty(vim?)をつかってプログラミングしています。
どのようにしてファイル名を指定すればいいでしょうか?

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

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

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

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

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

pepperleaf

2018/05/23 14:09

puttyという事は、Linuxにリモートログインしているという事でしょうか? そこで、vimを使ってソースコードの編集を行っている? 環境を明記した方が良いと思います。リモートログインならば、シェルが動いていると思うので、単にそこでコマンドプロンプトの場合と同様に実行すれば、良いだけでは? なお、プログラム名の先頭に "./" を付けないとNGな場合もあるので注意。
guest

回答3

0

ベストアンサー

環境についての記載がありませんが、気になった事も合わせて以下に書いてみます。

コンパイル環境として、Linuxを使っているかと思います。
今まで、Windowsでは、コマンドプロンプトから、コンパイル実行してきたのでしょうか? その場合、以下のようなコマンドライン?

cl [プログラム名].c

とすると、出力ファイルは、 [プログラム名].exe となって、実行は、

[プログラム名]

で実行できます。 Linuxでは、シェルから、
$ gcc [プログラム名]

でしょうか? (オプション指定無しの場合) この場合、実行は、
$ ./a.out
になります。

なお、ソースコードの fgetc() の件は、fgetc()の戻り値が int で、EOFもintなので、 int ch; が正しいという事です。 あるいは、 feof() を使えば、ファイルの終わりを判定できます。 (ただし、最後の一文字を読み込んだ後)

また、unicode 云々の話もあり、fgetc()は、(俗に言う)半角英数字のみで使った方が良いです。漢字でも使えますが、文字コード云々の話があり、簡単ではありません。

以上、参考になれば。

投稿2018/05/25 12:32

pepperleaf

総合スコア6383

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

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

0

直接の回答ではありませんが気になったので・・・
char ch; は(ch = fgetc(fp)) != EOF の判定でおかしくなりますよd^^ int ch;と宣言しましょう。

投稿2018/05/23 09:20

cateye

総合スコア6851

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

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

pepperleaf

2018/05/23 14:11

fgetc() の戻り値が int で、EOF が int と言うことですね。明記しないと知らない人も多いのでは? ただ、大抵の場合、char は符号付なので、動くのじゃなかったでしょうか。
HogeAnimalLover

2018/05/23 14:23

符号付、無しの問題ではありません。EOFの値を1バイトに切り詰めると、文字コードと重複する危険性があります。例えばUnicodeの一部の文字は0xffを含む2バイトで表現されます。EOFが0xffffffffであるとして、切り詰められると0xffとなりますので重複します。もっとも、UnicodeテキストならばテキストヘッダとしてBOMが埋め込まれるので、本文以前にBOMの読み込みで異常が発生するはずですけどね。
pepperleaf

2018/05/24 10:52

文字コードとの重複は分かっています。 しかし、質問者さんの環境とか、使われている(と思われる)文字範囲を考えたら、大きな問題ではないかと。 それよりも、なぜ、ダメか書かないと分からない人多数の予感。 また、feof() を勧めるべきかも。
y_waiwai

2018/05/24 11:30

ええっと、ひとの回答に不満があるなら、「あなた自身」が回答なさってはどうでしょうか?
cateye

2018/05/24 11:59

えっと、よくわからないのですが・・・ 自分がプログラムで使う関数の仕様って、確認して使うんじゃないですか? 分からないで使ったらデバッグなんかできないですよね?
pepperleaf

2018/05/24 13:49

> y_waiwaiさん、 回答に関する疑問点を提示しました。それに対する指摘は、回答者でない方です。なお、元の質問へ質問をコメントしています。 > cateyaさん、 普通、確認して使うものですが、確認していないから、間違えると思います。特に、EOFの件は、良く聞く(見る)話なので、コメントしました。
cateye

2018/05/27 00:20

らじゃ v^^ ・・・確かに多いよね・・・なんでだろう??; t.c:18:18: warning: implicit conversion loses integer precision: 'int' to 'char' [-Wconversion] while ((ch = fgetc(fp)) != EOF) { ~ ^~~~~~~~~ 1 warning generated. コンパイラが教えてくれるのに・・・
guest

0

exename "cp pro3_5 - 1.txt"

exename:実行ファイルの名前
でいいかと。

投稿2018/05/23 08:53

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問