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

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

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

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

Q&A

解決済

3回答

1635閲覧

電話帳で修正関数を作っています。修正箇所が浮かんでこないので助言をおねがいします。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/01/06 15:16

編集2018/01/07 09:05

電話帳で修正関数を作っています。
//氏名を修正する。
//電話番号を修正する。
のところで修正箇所のコードの書き方が浮かんでこないのでの助言、ヒント
をお願いできればありがたいです。

#include <stdio.h> #include <stdlib.h> #include <string.h> #define Max 256 char dtfile[]="data_tel3.txt"; char dtfile2[]="data_tmp2.txt"; int main(void) { FILE *fp1,*fp2 ; char line[Max]={0}; // 検索対象文字列を読み込む配列 char line2[Max]={0}; char buff[256]; //検索文字列 char buf1[256]; char buf2[256]; int count=0; char *ptr; if(!(fp1 = fopen(dtfile, "r"))){ printf("ファイルを開くことができません\n"); exit(1); } if ((fp2 = fopen(dtfile2, "w")) == NULL) { fprintf(stderr, "ファイルのオープンに失敗しました.\n"); exit(1); } printf("修正する名前を検索します。修正する名前を入力して下さい。\n"); scanf("%s",buff); //printf("buff=%s\n" ,buff ); printf("修正前のdata_tel3.txt\n"); //linesから1行ずつ取り出す。 while(fgets(line, 256, fp1) != NULL){ printf( "%s" ,line ); } fseek(fp1, 0, SEEK_SET); while(fgets(line, 256, fp1) != NULL){ ptr=strstr(line,buff); if(ptr){ printf( "\n\n" ); //氏名を修正する。 printf("%sの名前を修正する。\n",ptr); scanf("%s",buf1); strtok(buf1,"\n"); //電話番号を修正する。 printf("%sの電話番号を修正する。\n",ptr); scanf("%s",buf2); strtok(buf2,"\n"); sprintf(line,"%-11s,%s\n",buf1,buf2); //書式付き出力を文字列bufに格納する //data_tmp.txtに修正したデータを保存する fputs(line,fp2); }else{ //data_tmp.txtに修正する前のデータを保存する // 書き込み fputs(line,fp2); count++; if ( count < 0 ) { count=fprintf(stderr, "ファイルの書込みに失敗しました.\n"); exit(1); } } } fclose(fp2); fclose(fp1); printf("\n\n"); fp2 = fopen(dtfile2, "r"); fp1 = fopen(dtfile, "w"); printf( "一時ファイルdata_tmp2.txt\n" ); while(fgets(line2, 256, fp2) != NULL){ printf( "%s" ,line2 ); // 書き込み fputs(line2,fp1); count++; if ( count < 0 ) { count=fprintf(stderr, "ファイルの書込みに失敗しました.\n"); exit(1); } } fclose(fp1); printf("\n\n"); fp1 = fopen(dtfile, "r"); printf( "修正後のdata_tel3.txt\n"); while(fgets(line, 256, fp1) != NULL){ printf( "%s" ,line ); } // ファイルクローズ fclose(fp1); fclose(fp2); return 0; } 実行結果 naka@naka ~/kadai/kadai9-8 $ gcc -o data_amend2 data_amend2.c -Wall nakamura@nakamura ~/kadai/kadai9-8 $ data_amend2 修正する名前を検索します。修正する名前を入力して下さい。 naka 修正前のdata_tel3.txt sachiko ,090-0809 naka ,090-0787 kiyoko ,090-9999 satou ,090-3214 kinosita ,090-8769 yamada ,090-4325 itou ,080-6354 sudou ,090-3333 kitou ,080-1342 naka ,090-0787 の名前を修正する。 nabe naka ,090-0787 の電話番号を修正する。 090-0007 一時ファイルdata_tmp2.txt sachiko ,090-0809 nabe ,090-0007 kiyoko ,090-9999 satou ,090-3214 kinosita ,090-8769 yamada ,090-4325 itou ,080-6354 sudou ,090-3333 kitou ,080-1342 修正後のdata_tel3.txt sachiko ,090-0809 nabe ,090-0007 kiyoko ,090-9999 satou ,090-3214 kinosita ,090-8769 yamada ,090-4325 itou ,080-6354 sudou ,090-3333 kitou ,080-1342

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

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

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

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

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

guest

回答3

0

どうやって/どのように修正するのか示されていないので答えようがありません。

投稿2018/01/06 22:39

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 00:35

いつも拙い質問ですみません。今起きました。これから自分で検討してみます。
episteme

2018/01/07 01:22

「我ながら何を訊ねているかわからん」と感じているうちは質問しちゃいけないんちゃいますか?
退会済みユーザー

退会済みユーザー

2018/01/07 04:56

いつも文句ばかりで、楽しく勉強しているんですけど。何時間も苦戦しているときこういうコメント はへこんでしまいます。謝っている人に失礼だと思いますが。 あなたはプロ中のプロだとおもわれます。それでも教えてもらえる人には感謝しています。 お互い不毛な議論はよしましょう。
episteme

2018/01/07 05:04 編集

そうじゃなくて、「知りたいこと/やって欲しいことが伝わらん質問には答えようがない」てことです。 やりたいことは何ですか? 「名前(name) と 電話番号(phone) を入力すれば、ファイルにある名前とnameが一致したときその名前に対応する電話番号をphoneで置き換える」ですか?
guest

0

ベストアンサー

勝手に想定して作成しております、一回に一人しかできないものですので、ご参考まで

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4//#include <sys\stat.h> 5 6#define N 256 7#define Max 100 8 9char dtfile[]="data_tel3.txt"; 10char dtfile2[]="data_tmp2.txt"; 11 12void amend(); // データの修正 13 14int main(void) 15{ 16 data_amend(); 17 18 return 0; 19} 20 21int data_amend() 22{ 23 FILE *fp1,*fp2 ; 24 char line[Max]={0}; // 検索対象文字列を読み込む配列 25 char line2[Max]={0}; 26 char buff[256]; //検索文字列 27 char buf1[256]; 28 char buf2[256]; 29 int count=0; 30 char *ptr; 31 32 if(!(fp1 = fopen(dtfile, "r"))){ 33 printf("ファイルを開くことができません\n"); 34 exit(1); 35 } 36 if ((fp2 = fopen(dtfile2, "w")) == NULL) { 37 fprintf(stderr, "ファイルのオープンに失敗しました.\n"); 38 return -1; 39 } 40 41 printf( "削除前のdata_tel3.txt\n"); 42 //linesから1行ずつ取り出す。 43 while(fgets(line, 256, fp1) != NULL) 44 printf( "%s" ,line ); 45 printf( "\n"); 46 rewind(fp1); 47 48 printf("修正する名前を検索します。修正する名前を入力して下さい。\n"); 49 scanf("%s",buff); 50 51 while(fgets(line, 256, fp1) != NULL){ 52 53 ptr=strstr(line,buff); 54 if(ptr){ 55 printf( "%s" ,line ); 56 57 //氏名を修正する。 58 printf("修正する名前を入力して下さい。\n"); 59 scanf("%s",buf1); 60 strtok(buf1,"\n"); 61 //電話番号を修正する。 62 printf("修正する電話番号を入力して下さい。\n"); 63 scanf("%s",buf2); 64 strtok(buf2,"\n"); 65 sprintf(line,"%-13s%s\n",buf1,buf2); 66 67 //data_tmp.txtに修正したデータを保存する 68 fputs(line,fp2); 69 }else{ 70 //data_tmp.txtに修正する前のデータを保存する 71 // 書き込み 72 fputs(line,fp2); 73 count++; 74 if ( count < 0 ) { 75 count=fprintf(stderr, "ファイルの書込みに失敗しました.\n"); 76 return -1; 77 } 78 } 79 } 80 fclose(fp2); 81 fclose(fp1); 82 83 printf("\n\n"); 84 fp2 = fopen(dtfile2, "r"); 85 fp1 = fopen(dtfile, "w"); 86 87 printf( "一時ファイルdata_tmp2.txt\n" ); 88 while(fgets(line2, 256, fp2) != NULL){ 89 printf( "%s" ,line2 ); 90 91 // 書き込み 92 fputs(line2,fp1); 93 count++; 94 if ( count < 0 ) { 95 count=fprintf(stderr, "ファイルの書込みに失敗しました.\n"); 96 return -1; 97 } 98 } 99 fclose(fp1); 100 printf("\n\n"); 101 fp1 = fopen(dtfile, "r"); 102 103 printf( "修正後のdata_tel3.txt\n"); 104 while(fgets(line, 256, fp1) != NULL){ 105 printf( "%s" ,line ); 106 } 107 108 // ファイルクローズ 109 fclose(fp1); 110 fclose(fp2); 111 112 return 0; 113}

投稿2018/01/07 01:25

編集2018/01/07 08:29
A.Ichi

総合スコア4070

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 06:46

ありがとうございます。目的とするところまできましたが、修正後のdata_tel3.txtの修正したデータが2バイトほどずれるのですが、どうすればいいでしょうか。それと修正前のデータをすべて表示してから、 「修正する名前を入力して下さい。 naka 修正する電話番号を入力して下さい。」 と表示できるようにしたいのですがどうしたらいいでしょうか。 よろしくおねがいいたします。
退会済みユーザー

退会済みユーザー

2018/01/07 07:50

2バイトずれる問題は解決しました。
A.Ichi

2018/01/07 08:30

ご要望のに添えたかは分かりませんが、修正しました。
退会済みユーザー

退会済みユーザー

2018/01/07 08:57

すべて解決しました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/01/07 08:58

ありがとうございました。実行結果をしゅうせいしておきます。
guest

0

コードに書かれているコメントから、データ内の名前または電話番号を修正したいということだろうと思います。
データ形式が示されていないので、具体コードは書きようがないですが、つくりとして改善したほうがよさそうなところをアドバイスします。

  • 出力には「修正する名前を検索します。」としながら、いきなり修正処理に入るのはいかがなものでしょうか。同じような例をほかの方の例でも見ていますが、同じ名前の方をどう識別選択するか、特に今回修正処理ということで、名前だけでなく電話番号にも誤入力による重複があるのかもしれません。そのあたりをプログラムとしてどうするか考えてみてください。
  • また、修正として、「名前の修正」「電話番号の修正」とのことですが、名前しか入力させていません。しかもデータ内の名前が間違っていたら、そもそも一致しないので行が該当しません。このあたりもどうするか検討する必要があります。

一般的には、データを信用せず、行番号を付して選択させることで、修正行を特定するような仕組みが用いられるでしょう。

投稿2018/01/07 00:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 00:33

もう少し検討してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問