🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

10796閲覧

テキストファイルの一部書き換え. C言語

kananananana

総合スコア6

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/13 08:48

編集2021/02/13 09:21

テキストファイルに記載されている名前かID(どちらかを検索する)からファイルに記載されている電話番号変更するプログラムをつくりたいのですが、どのようにプログラムを作成すればよいでしょうか。

tel.txt(ひとつのファイルです)

NAME: aaa
ID: ID01
TEL: 090xxxxxxx1
DEP: a

=======================
NAME: bbb
ID: ID02
TEL: 090xxxxxxx2
DEP: a

=======================
NAME: ccc
ID: ID03
TEL: 090xxxxxxx3
DEP: a

=======================
NAME: ddd
ID: ID04
TEL: 090xxxxxxx4
DEP: a

=======================
NAME: eee
ID: ID05
TEL: 090xxxxxxx5
DEP: a

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

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

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

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

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

DaiGuard

2021/02/13 09:00

この複数のIDと電話番号は複数のテキストファイルに保存されているのですか? それもと一つのファイルにまとめて記載されているのですか? 例えばこんな感じ ```text NAME: aaa ID: ID01 TEL: 090xxxxxxxx NAME: bbb ID: ID02 TEL: 090xxxxxxxx NAME: ccc ID: ID03 TEL: 090xxxxxxxx ```
kananananana

2021/02/13 09:02

ひとつのファイルにまとめて記載しています。そして”===”を利用して区切っております。
pepperleaf

2021/02/13 09:50

まずは作ってみませんか? このままでは単なる作業依頼になります。 それとも全く手が付かない、、という事?
guest

回答2

0

ベストアンサー

今回の課題はC言語でやるにはかなり難しいですね

C言語ではファイルの一部だけを変更する機能がないので
一度、全部読み出してから、データを変更して、もう一度全部書き出す
そんな方法になります

1.データを読み出す

まずは先頭から1行づつ読み出していって
区切り文字である===が見つかるまでデータを読み処理を書きましょう

c

1int main(int argc, char** argv) 2{ 3 const char file_name[] = "./data/tel.txt"; 4 5 FILE* r_fp = fopen(file_name, "r"); 6 if(r_fp == NULL) 7 { 8 printf("file open error -> %s", file_name); 9 } 10 11 char text_line[256]; 12 13 while(fgets(text_line, sizeof(text_line), r_fp) != NULL) 14 { 15 // 区切りコードを認識してデータを区切る 16 if(strstr(text_line, "===")!=NULL) 17 {} 18 } 19 20 fclose(r_fp); 21}
  1. 一行づつ読んだデータからなんのデータかを判断する

今回は行先頭の数文字がデータヘッダになっているますね
NAME: , ID: とか
なので一行の先頭文字からヘッダを認識してなんのデータかを判断しましょう

C

1 if(strncmp(text_line, "NAME: ", 6)==0) 2 { 3 data.have_name = true; 4 strncpy(data.name, text_line+6, strlen(text_line)-7); 5 }
  1. 読み込んできたデータを構造体に保存しましょう

区切り文字の間で必要なデータであるNAME,ID,TEL,DEPが全て含まれているか保証できないので、以下のような構造体を作って、すべてのデータがあるか確認しましょう

C

1struct UserData 2{ 3 bool have_name; 4 char name[256]; 5 bool have_id; 6 char id[10]; 7 bool have_tel; 8 char tel[11]; 9 bool have_dep; 10 char dep[10]; 11}; 12
  1. データを変更して保存

あとは簡単で上のデータに必要な変更を加えて保存してください

頑張ってください

投稿2021/02/13 10:30

DaiGuard

総合スコア159

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

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

pepperleaf

2021/02/13 11:11

ファイルの読出し --> 新しいファイルへ書き出し。 終わったら、古いファイルを消して、新しいファイルをリネーム そうすれば、全データを読み込む必要は無いですね。
tatsu99

2021/02/14 00:43

全データを読まないと無理だと思いますが、どのようにすれば、そうなりますか。
pepperleaf

2021/02/14 00:50

> 全データを読まないと.... こちらへのコメントでしょうか... 全データを読み込んで"保持する必要"は無いの誤りです。(全データ用のバッファが必要無い) 書き方が不十分で申し訳ないです。
tatsu99

2021/02/14 01:07

(全データ用のバッファが必要無い)・・・の意味ですが、 データを格納する構造体は全員分確保する必要があるが、データを読み込むバッファ (char text_line[256];)は、全行分確保する必要はない。 という意味と理解しましたが、あってますでしょうか。
pepperleaf

2021/02/14 05:38

特定の名前、または IDの電話番号だけを変更するならば、 一人分のデータを読み込むだけのバッファがあれば、十分と思います。 目的が違えば、当然、方法も変わりますが。
tatsu99

2021/02/14 05:49

事前に変更対象となる名前又はIDがきまっていれば、そうなりますね。ありがとう御座いました。
kananananana

2021/02/14 08:55

まだ完成はしていないですが、頑張ってみます。ありがとうございます。
guest

0

  1. そのデータを格納する構造体を定義
  2. その構造体の配列を定義し、メモリ確保を行う
  3. そのファイルを読み込み、配列に展開
  4. 該当箇所を検索
  5. 電話番号を修正
  6. 修正箇所が終わるまで4から繰り返し
  7. その配列をファイルに書きこみ
  8. おしまい

という手順となろうかと思います。
がんばってください

投稿2021/02/13 09:15

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問