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

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

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

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

Q&A

解決済

1回答

423閲覧

名前と番号のデータを削除する関数を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/12/17 11:07

編集2017/12/18 11:51

以下のデータを削除する関数を作りたいのですが、
void data_delete()のコードの不備、誤りを教えてください。
とりあえずここまでできています。
void data_delete()でデータを削除するコードが分かりません。

/*これはdata_telというファイルを操作するプログラムでいいのかな? 削除の実装は標準Cだけだとかなりだるい。 別ファイルに書き出して元ファイル削除してリネームという手法になる。 ファイル削除はremove、ファイル名変更はrenameを使う。 つまり 現状のコード同様文字列検索する。 1. 一つでも見つかったらfstatでファイルサイズを求める 2. ファイルサイズ分のメモリーを確保 3.fseekでファイル先頭に戻り、freadですべて確保したメモリーへ読み込み。 一時ファイルのハンドルを得る 4.strstrを駆使しながら削除部分以外を一時ファイルにfwriteで書き込み(大変) 全ファイルハンドルclose 5.data_telをremove 6.一時ファイルをdata_telにrename というくっそ面倒なことやることになる。 data_amend() */ /* data_tel naka 080-7777 kiyoko 090-9999 satou 090-3214 kinosita 080-8679 yamada 090-4325 */ #include<stdio.h> #include<string.h> //for strcmp,strstr #include<stdlib.h> //for exit #define N 256 #define MAX 100 // MAX100人 char names[MAX][20]; // MAX100人、20文字 char tel[MAX][20]; // MAX100人、20文字 int val; // 名前と番号の配列番号 void data_show(); // データ表示 void data_delete(); int main() { data_delete(); data_show(); } void data_show() { FILE *fp; val=0; if(!(fp = fopen("data_tel.txt", "r"))){ printf("ファイルを開くことができません\n"); exit(1); } printf("名前番号\n"); printf("-------------------------\n"); while(fscanf(fp, "%s%s", names[val], tel[val])!=-1) { printf("%-10s%5s\n",names[val], tel[val]); val++; } fclose(fp); } void data_delete() { static char buff[N]; FILE *fp; int len; int i=0; val=0; if(!(fp = fopen("data_tel.txt", "r"))){ printf("ファイルを開くことができません\n"); exit(1); } printf("削除する名前を検索します。検索する名前を入力して下さい。\n"); scanf("%s",buff); while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){ //fscanfでファイルを1行ずつ読み込む // while( fscanf(fp,"%s,%s",&buf[0],&buf[1]) != EOF ){ // printf("%s,%s\n",buf[0],buf[1]); if(strstr(names[val],buff) || strstr(tel[val],buff)){ //文字列namesの中から文字列buffを探しそのアドレスを返す。 //発見できなければNULL(\0)を返す。 printf("%-10s%5s\n",names[val],tel[val]); i=1; len = strlen( &names[100][20]); // 文字列namesの長さを返す。 // strlen関数は文字列の長さを「バイト数」で返します。 // namesの長さは20バイト, telの長さは20バイト,\0がついているので // データ1行の長さは42バイト printf( "len=%d\n" , len ); //見つかると削除する(ここで削除したい) } } printf("削除された名前: %s\n", buff); if(i==0) printf("名前が見つかりません: %s\n", buff); fclose(fp); } /*実行結果 naka@naka ~/kadai $ gcc -o data_delete1 data_delete1.c -Wall naka@naka ~/kadai $ data_delete1 削除する名前を検索します。検索する名前を入力して下さい。 kiyoko //関数scanfの表示 kiyoko 090-9999 //関数data_delete1の表示 len=4 削除された名前: kiyoko 名前番号 //関数data_show();の表示 ------------------------- naka 080-7777 kiyoko 090-9999 satou 090-3214 kinosita 080-8679 yamada 090-4325 naka@naka ~/kadai */

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

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

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

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

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

Zuishin

2017/12/20 01:32

C の学習のためにやっているのなら頑張ってください。実用なら awk を使うと多分一行で書けます。
guest

回答1

0

ベストアンサー

これはdata_telというファイルを操作するプログラムでいいのかな?内容的に素直にSQL(MariaDBとかとか)使って、という思いがあるけどそれはさておき。

data_delete()

肝心の削除部分がない。

削除の実装は標準Cだけだとかなりだるい。
別ファイルに書き出して元ファイル削除してリネームという手法になる。

ファイル削除はremove、ファイル名変更はrenameを使う。

つまり

  1. 現状のコード同様文字列検索する。
  2. 一つでも見つかったらfstatでファイルサイズを求める
  3. ファイルサイズ分のメモリーを確保
  4. fseekでファイル先頭に戻り、freadですべて確保したメモリーへ読み込み。
  5. 一時ファイルのハンドルを得る
  6. strstrを駆使しながら削除部分以外を一時ファイルにfwriteで書き込み(大変)
  7. 全ファイルハンドルclose
  8. data_telremove
  9. 一時ファイルをdata_telrename

というくっそ面倒なことやることになる。

data_amend()

上記同様。やはりだるい。

結論

難易度高すぎるので素直にSQLつかいません?

投稿2017/12/17 15:58

yumetodo

総合スコア5850

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

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

退会済みユーザー

退会済みユーザー

2017/12/17 20:57

色々、この方法では面倒そうですね。拾って来たプログラムですけど、そんなんで削除と修正がないのだと思います。関数の勉強のためにすこしがんばってやってみます。途中で放棄するかもしれませんが、ありがとうございます。分からないときはまたおねがいいたします。
yumetodo

2017/12/18 00:21

引き続きこの質問にリプライしていただくかTwitter/mastodon(@yumetodo@pawoo.net)にリプライいただければ見に行きます
退会済みユーザー

退会済みユーザー

2017/12/18 06:51

ありがとうございます。お仕事がありますので少し時間をください。リストを使ったプログラムは なんとか読み解いたのですが、ご教授頂いたコメントの関数を勉強したいとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問