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

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

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

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

Q&A

解決済

2回答

2616閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2016/04/17 02:21

住所録プログラムで実行すると正常に動作はするのですが、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> */

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

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

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

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

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

guest

回答2

0

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

投稿2016/04/17 03:51

takasima20

総合スコア7458

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

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

0

ベストアンサー

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

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

投稿2016/04/17 03:23

archiver

総合スコア1557

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

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

退会済みユーザー

退会済みユーザー

2016/04/17 04:59

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

2016/04/17 05:19 編集

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

退会済みユーザー

2017/11/12 08:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問