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

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

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

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

Q&A

解決済

4回答

1547閲覧

プログラムを実行するとエラーが出ます。。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/01/04 03:28

編集2018/01/04 06:29

プログラムを実行するとエラーが出ます。
$ data_add data_tel.txtで実行すると「ファイルの内容を書き込んで下さい。」と出て
sudou ,090-3333
kitou ,080-1342と打ち込むと、“data_tel.txt”ファイルに書き込みました。
と表示されるようになりました。sudouがudouになぜなるかまできました。
よろしくお願いいたします。

コード //  ファイルの新規書き込み // コマンドラインに引数としてファイルを指定し、 // ファイルに内容を書き込む。 // 指定されたファイルが存在する場合は、その内容をゼロにする。 // data_add.c #include<stdio.h> #include<string.h> //for strcmp,strstr #include<stdlib.h> //for exit #define CTRL_Z 26 int data_add(char*); int main(int argc,char *argv[]) { fprintf(stderr, "Check\n"); if (argc != 2) { puts("error01:[使用方法]:<プログラム名> <ファイル名>"); return 1; } return data_add(argv[1]); } int data_add(char *filename) { FILE *fp1; char ch1; if ((fp1 = fopen(filename, "w")) == NULL) { puts("error01:ファイルを開くことができません。"); return 1; } puts("ファイルの内容を書き込んで下さい。"); puts("プログラムを終了するときは「Ctrl + z 」を押します。"); getchar(); //改行消去 while((ch1=getchar()) != EOF) { if (fputc(ch1,fp1) == EOF) { printf("error01:ファイルに書き込めません\n"); fclose(fp1); return 1; } } if (fclose(fp1) == EOF) { puts("error01:ファイルを閉じることが出来ません\n"); return 1; } printf("\n“%s”ファイルに書き込みました。\n", filename); return 0; } 実行結果 naka@naka ~/kadai/kadai9-8 $ gcc -g -o data_add1 data_add1.c -Wall naka@naka ~/kadai/kadai9-8 $ data_add1 data_tel.txt Check ファイルの内容を書き込んで下さい。 プログラムを終了するときは「Ctrl + z 」を押します。 sudou ,090-3333 kitou ,080-1342 ^Z “data_tel.txt”ファイルに書き込みました。 naka@naka ~/kadai/kadai9-8 $ data_tel.txt sachiko ,090-0809 naka ,090-7777 kiyoko ,090-9999 satou ,090-3214 kinosita ,090-8769 yamada ,090-4325 itou ,080-6354 udou ,090-3333 // 追加されたデータ kitou ,080-1342 // 追加されたデータ data_tel.txtはsudouと入力したのに、左に1個ずれているみたいです。 電話番号が1個ひだりにずれています。

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

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

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

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

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

guest

回答4

0

ベストアンサー

こんにちは。

error01:ファイルを開くことができません。というメッセージがでているということは、if(!(argc==2))の条件が成立していないですから、argcは2になってますよ。

data_add(argc,&argv[1]);

これはargv[1]だけ渡してますよ。下記で良い筈です。

data_add(argc,argv);

投稿2018/01/04 03:59

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2018/01/04 04:50

ありがとうございます。コンパイル、実行できましたが、実行結果でエラーが出て、data_tel.txtに書き込まれていません。どこが間違っているのでしょうか。
退会済みユーザー

退会済みユーザー

2018/01/04 06:34

もうすこしのところまできました。教えて頂きませんか。質問を少し変更しています。
Chironian

2018/01/04 07:54

> getchar(); //改行消去 これで1文字目の"S"が読み捨てられています。 改行はそのまま出力してしまって良いようにも感じます。
退会済みユーザー

退会済みユーザー

2018/01/04 13:40

ありがとうございます。皆さんに教えてもらって、解決しました。 ずっと前にお聞きした課題9-8の電話帳に挑戦しています。 配列で無理やりやっています。いろいろ勉強になります。 そのあとlist構造にも挑戦したいと思います。よろしくお願いいたします。
guest

0

main で argv の1番目のアドレスを渡している

c

1data_add(argc,&argv[1]);

のですから data_add から見ると argv[0] にファイル名が入っています。

c

1if(!(fp1=fopen(argv[1],"w"))){

これを

c

1if(!(fp1=fopen(argv[0],"w"))){

に変えると動くかと思います。

投稿2018/01/04 03:54

mattn

総合スコア5030

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

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

退会済みユーザー

退会済みユーザー

2018/01/04 04:55

そうですね。ありがとうございます。argv==argv[0]==ファイル名でした。Chironianさんに教えて頂いた方法で実行まではできましたが、書込みができないです。
mattn

2018/01/04 05:00

「書き込みができない」の内容を教えて下さい。何がどの様に書かれないのか、期待する結果は何か。
退会済みユーザー

退会済みユーザー

2018/01/04 05:37

コピペして実行したのですがURLどうりにならないのですが、私の実行結果では 「o」だけになるのですが。「oa」とかになります。
mattn

2018/01/04 05:42

環境は何でしょうか? Windows? Mac? Linux? >私の実行結果では 「o」だけになるのですが。「oa」とかになります。 起動後に o をタイプして CTRL-Z をタイプ → ファイルの内容が oa になるという意味でしょうか?
退会済みユーザー

退会済みユーザー

2018/01/04 05:54

tmp.txt の中が fooだけだと「o」になります。次にbarと打つと「a]が追加されて「oa」なります。 modeはaでオープンしています。windowsでMinGW32です。
mattn

2018/01/04 05:56

wandbox の内容が正しくコピーされコンパイルされているでしょうか?これが動かない場合、実行環境かコンパイラを疑うべきかと思います。
mattn

2018/01/04 06:41

getchar(); //改行消去 の行を消して下さい。
退会済みユーザー

退会済みユーザー

2018/01/04 06:45

ありがとうございました。できました。実はdelete()関数を作っている途中で、この関数を使おうと思っています。またよろしくお願いいたします。
guest

0

この辺りはC言語とOSとのインターフェースの基本的なところなので、次のようなコードを書いてどういう結果になるかまず確かめてみてはいかがでしょう?

C

1#incude <stdio.h> 2 3int main(int argc, const char* argv[]) { 4 for (int i = 0; i < argc; i++) { 5 printf("argv[%d] = %s\n", i, argv[i]); 6 } 7 return 0; 8}

投稿2018/01/04 03:46

KSwordOfHaste

総合スコア18392

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

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

退会済みユーザー

退会済みユーザー

2018/01/04 04:58

ありがとうございます。原因を探してネットでいろいろ探してプログラムを実行して、正常に表示されました。実行済みです。
guest

0

原因については既に指摘があるとおりですが、そもそもdata_addにargvを渡す必要はないのでは。

C

1void data_add(const char* filename); 2 3int main(int argc, char **argv) { 4 if(argc != 2) { 5 printf("error01:[使用方法]:<プログラム名>_<ファイル名>"); 6 exit(1); 7 } 8 9 data_add(argv[1]); 10 11 ... 12}

投稿2018/01/04 04:17

LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2018/01/04 04:39

ありがとうございます。Louisさんおせわになっております。本年もよろしくお願いいたします。 実行結果でデータが書き込まれていないのですが、どうしてですか。教えてください。
LouiS0616

2018/01/04 04:47

本年もよろしくお願いします。
LouiS0616

2018/01/04 04:48 編集

ループ内でfcloseしている部分が原因のように思います。fcloseはこの場合関数data_addの最後に一回だけ呼べばいいかと思います。
退会済みユーザー

退会済みユーザー

2018/01/04 05:06

やってみましたが、だめですね。
LouiS0616

2018/01/04 05:29

修正後のコードを見せていただけますか。 どのようにだめなのかちょっと再現できないので。
退会済みユーザー

退会済みユーザー

2018/01/04 05:49

すみませんmattnさんのコードを使わせていただきました。
退会済みユーザー

退会済みユーザー

2018/01/04 06:32

いじっているうちに、書込みできるようになりましたが、表示が最初のsudouがudouとなります。 どこか、ちょっとだけ間違っていると思うのですが。よろしくおねがいいたします。
LouiS0616

2018/01/04 06:33

『改行消去』の行が無駄なんじゃないですかね。
退会済みユーザー

退会済みユーザー

2018/01/04 06:40

Louis さん、mattnさん、ありがとうございました。仰せの通りでした。 出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問