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

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

ただいまの
回答率

90.50%

  • C

    3801questions

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

c住所録プログラムで実行して、1回閉じて全体表示を選ぶと0件と表示される

解決済

回答 2

投稿

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

sanchu52

score 140

住所録プログラムで実行すると正常に動作はするのですが、1回閉じて実行すると、全体表示を選ぶと0件と表示される。
プログラムの追加でデータを追加すると、データは追加で表示されているのですが、実際データに追加されていない状態です。address.csvに1件入っているデータも表示されない状態です。
よろしくお願いいたします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 128
#define FILENAME "address.csv"

typedef struct address {
  char Add[51];  // 住所 
  char Name[21]; // 氏名 
  char Tel[11];  // 電話番号
  struct address *prev; // 前のリスト 
  struct address *next; // 次のリスト 
} Address;

Address *search(Address *);
Address *add(Address *);
Address *amend(Address *);
Address *del(Address *);
Address *printall(Address *);
Address *data_write(Address *);
Address *(*func[])(Address *) = {search, add, amend, del, printall};

int main(void)
{
  Address *ap = NULL, *t;
  char dummy[BUFSIZE];
  int i;
  FILE *fp;
  fp = fopen(FILENAME,"r");
      if(fp==NULL){
        printf("file not open\n");
        exit(1);
      }

      //char ch[512];
  while (1) {
    puts("●メニューを入力して下さい");
    puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表\示\n6.終了");
    scanf("%d", &i); 
    gets(dummy);
    if (1 <= i && i <= 5) ap = func[i - 1](ap);
    else if (i == 6) break;
  }

  /* リストを開放 */
  while (ap != NULL) {
    t = ap->next;
    free(ap);
    ap = t;
  }

  return 0;
}

Address *search(Address *ap)
{
  char buf[BUFSIZE], dummy[BUFSIZE];
  char *target[] = {"住所", "氏名", "電話番号"};
  int i, cnt = 0, count = 0;
  Address *t = ap;

  while (1) {
    puts("何で探しますか?\n1.住所 2.氏名 3.電話番号");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 3) break;
  }
  printf("%sを入力して下さい:", target[--i]);
  gets(buf);

  while (t != NULL) {
    switch (i) {
    case 0: /* 住所 */
      if (!strcmp(t->Add, buf)) goto print;
      break;
    case 1: /* 氏名 */
      if (!strcmp(t->Name, buf)) goto print;
      break;
    case 2: /* 電話番号 */
      if (!strcmp(t->Tel, buf)) goto print;
      break;
    default: /* no condition */
      break;
    }
    t = t->next;
    cnt++;
    continue;

    print:;
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", ++cnt, t->Add, t->Name, t->Tel);
    t = t->next;
    count++;
  }
  printf("%d件見つかりました\n", count);

  return ap;
}

Address *add(Address *ap)
{
  Address *t = ap;

  while (t != NULL && t->next != NULL) t = t->next;

  if (t != NULL) {
    if ((t->next = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->next->prev = t;
    t = t->next;
  } else {
    if ((ap = t = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->prev = NULL;
  }
  t->next = NULL;

  printf("住所:"); /* 住所 */
  gets(t->Add);
  printf("氏名:"); /* 氏名 */
  gets(t->Name);
  printf("電話番号:"); /* 電話番号 */
  gets(t->Tel);
  /*表示*/
  /* printf("%s %s %s\n", t->Add, t->Name, t->Tel); */

  return ap;
}

Address *amend(Address *ap)
{
  Address *t = ap;
  char buf[BUFSIZE];
  int i, cnt = 0;

  puts("何番を修正しますか?");
  scanf("%d", &i); gets(buf);

  while (t != NULL) {
    if (++cnt == i) {
      puts("変更しない場合は単に[return]を押して下さい");
      printf("住所: %s -> ", t->Add);
      gets(buf);
      if (strlen(buf)) strcpy(t->Add, buf);
      printf("氏名: %s -> ", t->Name);
      gets(buf);
      if (strlen(buf)) strcpy(t->Name, buf);
      printf("電話番号: %s -> ", t->Tel);
      gets(buf);
      if (strlen(buf)) strcpy(t->Tel, buf);
      return ap;
    } else  t = t->next;
  }
  puts("番号が大きすぎます");
  return ap;
}

Address *del(Address *ap)
{
  Address *t = ap;
  char buf[BUFSIZE];
  int i, cnt = 0;

  puts("何番を削除しますか?");
  scanf("%d", &i); gets(buf);

  while (t != NULL) {
    if (++cnt == i) {
      if (t->prev != NULL) { /* 先頭ノード以外 */
        t->prev->next = t->next;
        if (t->next != NULL) t->next->prev = t->prev;
      } else { /* 先頭ノード */
        if (t->next != NULL) t->next->prev = NULL;
        ap = t->next;
      }
      free(t);
      return ap;
    }
    t = t->next;
  }
  puts("番号が大きすぎます");
  return ap;
}

Address *printall(Address *ap)
{
  int cnt = 1;

  Address *t = ap;
  while (t != NULL) {
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", cnt++, t->Add, t->Name, t->Tel);
    t = t->next;
  }

  return ap;
}

Address *data_write(Address *t){
  FILE *fp;
  if ((fp = fopen(FILENAME,"w")) == 0) {
    printf("cannot open new file '%s'.\n", FILENAME);
    exit(1);
  }
  while(t){
    fprintf(fp,"%s,%s,%s\n",t->Name,t->Add,t->Tel);
    t = t->next;
  }
  fclose(fp);
  return 0;

}


/*
^C
C:\Users\username\chap09\kadai>gcc -o kadai9-8b kadai9-8b.c -Wall -std=c99

C:\Users\username\chap09\kadai>kadai9-8b
●メニューを入力して下さい
1.検索
2.追加
3.修正
4.削除
5.全体表示
6.終了
5
●メニューを入力して下さい
1.検索
2.追加
3.修正
4.削除
5.全体表示
6.終了
6

C:\Users\username\chap09\kadai>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

・address.csvに1件入っているデータも表示されない件
main関数でaddress.csvをオープンしていますが、読み込んでいるところが見当たりませんね。

・データが追加されない件
追加されないというのは、address.csvに追加されないということでしょうか?だとすると、ファイルへの書き出し処理であるdata_write()を呼んでいる箇所がありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/17 13:59

    main関数のif (1 <= i && i <= 5) ap = func[i - 1](ap);でご指摘の件は実行されていないのでしょうか?
    細かいところはいいですので。
    main関数のどこにどのようなコードを挿入するのでしょうか?
    ここにくるときはだいぶこんがらがっていますので、よろしくおねがいします。

    キャンセル

  • 2016/04/17 14:13 編集

    メニューに対応した処理を関数リストfunc[]に入れているということでしょうけど、やはりdata_write()が登録されていないので、実行されませんよね(「6.書き込み」とするならば)。
    もしくは、追加、修正、削除の延長でファイルへの書き出しをすると考えるならば、各処理の中でdata_write()を呼ぶようにしないとファイルへの書き出しはされません。
    それほど難しい話ではないと思うので、もう一度落ち着いて見直してみれば、どうやるべきかが見えてくると思います。

    大筋の流れとしてはtakasima20さんが別途回答されている感じになると思います。

    キャンセル

  • 2017/11/12 17:26

    長い間掘っておいた質問に帰ってきました。archiverさんに指摘されたことに挑戦したいとおもいます。 
    その前にストックしておいた住所録のプログラムをよみたいとおもいます。
    これからもよろしくお願いいたします。

    キャンセル

0

archiverさんが指摘されている通りですが…
mainでオープンしてるとこの後に、読み込んでリストに展開してcloseする処理を入れ、
リストを解放する前に書き込みを呼ぶって感じでしょか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    スタックの応用

    スタックを利用して入力された文字列の回文を作るプログラムを作成したら、出力されません。 例えば、「abcd」と入力したら、「abcddcba」と主著力される。 発生して

  • 解決済

    linux 処理時間の表示

    C言語でLinuxを使っています。メモリを確保したりするプログラムなのですが、以下のプログラムを修正して 、5秒間で何回の入れ替えを行えるかを計測できるようにしてもらいたいです。初

  • 解決済

    c言語 リスト構造の検索

    アドレス帳の検索機能だけのプログラムを作っています。 作りたいプログラムは、  1,検索したい人の名前を入力する  2,事前に登録された情報の中から部分一致検索する 

  • 解決済

    C言語で住所録管理ソフトを作成しているが、CSVファイルのデータを構造体にコピーする方法が分からない

    CSVファイルの中身は1行ごとに「名前,電話番号,住所」が記述されていてそれぞれの情報を構造体にコピーする形です。 線形リストで各個人のデータを管理したいと思っています。 構造

  • 解決済

    「ポインタのポインタ」のつなぎ替えをしている部分がわからない

    リストの構造体のデータをソートしているコードがあるんですが、その中の exchange()関数のところを図を使って書こうと思ったのですが、うまくいきません。 その前に書かれているコ

  • 解決済

    do文ループ中のfor文の繰り返しができない

     do文ループでのバグ あるサイトからお借りしたソースコードを改造したのですが、コンパイルするとdo文中のfor文が繰り返されず、do文直後の文と最後の文しか実行されないバグが起き

  • 解決済

    [C]〇桁の整数があり、各位の和を求めたい。

     問題点 〇桁の整数があり、その各位の和を求めたいのですが、やり方が、全く分かりません。 お願い 初心者なのでできれば、ひとつひとつ丁寧に教えて頂けると有り難いです。よろしくお

  • 解決済

    文字の出力について(C言語)

     前提・実現したいこと ここに質問の内容を詳しく書いてください。 名前を姓と名前をスペースを空けて入力し表示するプログラムがわかりません ■■な機能を実装中に以下のエラーメッセージ

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

  • C

    3801questions

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