以下のデータを削除する関数を作りたいのですが、
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 */
C の学習のためにやっているのなら頑張ってください。実用なら awk を使うと多分一行で書けます。
回答1件
あなたの回答
tips
プレビュー