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

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

ただいまの
回答率

90.52%

  • C

    3670questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

sanchu52

score 140

プログラムを実行するとエラーが出ます。
$ 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個ひだりにずれています。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

data_add(argc,&argv[1]);

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

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

これを

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 13:55

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

    キャンセル

  • 2018/01/04 14:00

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

    キャンセル

  • 2018/01/04 14:10 編集

    こうかなと思う内容で書き換えてみました。

    https://wandbox.org/permlink/5IAEzavnLw1jnop2

    キャンセル

  • 2018/01/04 14:37

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

    キャンセル

  • 2018/01/04 14:42

    環境は何でしょうか? Windows? Mac? Linux?

    >私の実行結果では 「o」だけになるのですが。「oa」とかになります。

    起動後に o をタイプして CTRL-Z をタイプ → ファイルの内容が oa になるという意味でしょうか?

    キャンセル

  • 2018/01/04 14:54

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

    キャンセル

  • 2018/01/04 14:56

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

    キャンセル

  • 2018/01/04 15:41

    getchar(); //改行消去

    の行を消して下さい。

    キャンセル

  • 2018/01/04 15:45

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

    キャンセル

checkベストアンサー

+1

こんにちは。

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

    data_add(argc,&argv[1]);

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

    data_add(argc,argv);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 13:50

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

    キャンセル

  • 2018/01/04 15:34

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

    キャンセル

  • 2018/01/04 16:54

    > getchar(); //改行消去

    これで1文字目の"S"が読み捨てられています。
    改行はそのまま出力してしまって良いようにも感じます。

    キャンセル

  • 2018/01/04 22:40

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

    キャンセル

+1

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

#incude <stdio.h>

int main(int argc, const char* argv[]) {
  for (int i = 0; i < argc; i++) {
    printf("argv[%d] = %s\n", i, argv[i]);
  }
  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 13:58

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

    キャンセル

0

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

void data_add(const char* filename);

int main(int argc, char **argv) {
    if(argc != 2) {
        printf("error01:[使用方法]:<プログラム名>_<ファイル名>");
        exit(1);
    }

    data_add(argv[1]);

    ...
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 13:39

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

    キャンセル

  • 2018/01/04 13:47

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

    キャンセル

  • 2018/01/04 13:47 編集

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

    キャンセル

  • 2018/01/04 14:06

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

    キャンセル

  • 2018/01/04 14:29

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

    キャンセル

  • 2018/01/04 14:49

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

    キャンセル

  • 2018/01/04 15:32

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

    キャンセル

  • 2018/01/04 15:33

    『改行消去』の行が無駄なんじゃないですかね。

    キャンセル

  • 2018/01/04 15:40

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3670questions

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