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

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

ただいまの
回答率

91.05%

  • C

    2958questions

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

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

解決済

回答 3

投稿 編集

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

sanchu52

score 101

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

#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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/07 09:35

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

    キャンセル

  • 2018/01/07 10:22

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

    キャンセル

  • 2018/01/07 13:56

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

    キャンセル

  • 2018/01/07 14:04 編集

    そうじゃなくて、「知りたいこと/やって欲しいことが伝わらん質問には答えようがない」てことです。

    やりたいことは何ですか?
    「名前(name) と 電話番号(phone) を入力すれば、ファイルにある名前とnameが一致したときその名前に対応する電話番号をphoneで置き換える」ですか?

    キャンセル

checkベストアンサー

0

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <sys\stat.h>

#define N 256
#define Max 100

char dtfile[]="data_tel3.txt";
char dtfile2[]="data_tmp2.txt";

void amend();             // データの修正

int main(void)
{
      data_amend();

      return 0;
}

int data_amend()
{
    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");
         return -1;
    }

    printf( "削除前のdata_tel3.txt\n");
    //linesから1行ずつ取り出す。
    while(fgets(line, 256, fp1) != NULL)
        printf( "%s" ,line );
    printf( "\n");
    rewind(fp1);

    printf("修正する名前を検索します。修正する名前を入力して下さい。\n");
    scanf("%s",buff);

    while(fgets(line, 256, fp1) != NULL){

        ptr=strstr(line,buff);
        if(ptr){
            printf( "%s" ,line );

            //氏名を修正する。
            printf("修正する名前を入力して下さい。\n");
            scanf("%s",buf1);
            strtok(buf1,"\n");
            //電話番号を修正する。
            printf("修正する電話番号を入力して下さい。\n");
            scanf("%s",buf2);
            strtok(buf2,"\n");
            sprintf(line,"%-13s%s\n",buf1,buf2);

            //data_tmp.txtに修正したデータを保存する
            fputs(line,fp2);
        }else{
            //data_tmp.txtに修正する前のデータを保存する
            // 書き込み
            fputs(line,fp2);
            count++;
            if ( count < 0 ) {
                count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
                return -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");
            return -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;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/07 15:46

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

    キャンセル

  • 2018/01/07 16:50

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

    キャンセル

  • 2018/01/07 17:30

    ご要望のに添えたかは分かりませんが、修正しました。

    キャンセル

  • 2018/01/07 17:57

    すべて解決しました。ありがとうございました。

    キャンセル

  • 2018/01/07 17:58

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/07 09:33

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

    キャンセル

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

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

関連した質問

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

  • C

    2958questions

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

  • トップ
  • Cに関する質問
  • 電話帳で修正関数を作っています。修正箇所が浮かんでこないので助言をおねがいします。