質問: 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 */ ```
回答: これは`data_tel`というファイルを操作するプログラムでいいのかな?内容的に素直にSQL(MariaDBとかとか)使って、という思いがあるけどそれはさておき。 `data_delete()` 肝心の削除部分がない。 削除の実装は標準Cだけだとかなりだるい。 別ファイルに書き出して元ファイル削除してリネームという手法になる。 ファイル削除は`remove`、ファイル名変更は`rename`を使う。 つまり 1. 現状のコード同様文字列検索する。 2. 一つでも見つかったら`fstat`でファイルサイズを求める 3. ファイルサイズ分のメモリーを確保 4. `fseek`でファイル先頭に戻り、`fread`ですべて確保したメモリーへ読み込み。 5. 一時ファイルのハンドルを得る 6. `strstr`を駆使しながら削除部分以外を一時ファイルに`fwrite`で書き込み(大変) 7. 全ファイルハンドルclose 8. `data_tel`を`remove` 9. 一時ファイルを`data_tel`に`rename` というくっそ面倒なことやることになる。 `data_amend()` 上記同様。やはりだるい。 結論 === 難易度高すぎるので素直にSQLつかいません?