【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23402

ファイルサイズ変更又はEOFの挿入
投稿者---果林(2005/09/29 16:25:32)


文字列が複数格納されているファイルに対して
先頭の文字列を削除して最後尾に追加するプログラムを作っています。
ただ今の状態ですと削除する文字列が追加する文字列より長いと
ファイルの後方にごみが残ってしまいます。

例えば
aaa
b
c
のファイルに対してdを入れると
b
c
d
c
となってしまいます。

どう対処したら
b
c
d
だけのファイルにすることができるのでしょうか?


ソースは以下のとおりです。
int fileupdate( const char *filename, char *new_data)
{
FILE *fp;
int old_fp=0, new_fp=0;
int over_cnt=1;
char log[DATASIZE];

memset(log, '\0', sizeof(log));

fp = fopen(filename, "r+" );
if (fp == NULL){
return(1);
}

while (fgets(log, DATASIZE, fp)){
old_fp += strlen(log);
/* 先頭は無視 */
if (over_cnt != 0){
over_cnt--;
continue;
}

/* ファイル更新後のファイルポインタに移動 */
fseek(fp, new_fp, SEEK_SET);

fprintf(fp, "%s", log);

new_fp += strlen(log);

/* ファイル更新前のファイルポインタに移動 */
fseek(fp, old_fp, SEEK_SET);

}

fseek(fp, new_fp, SEEK_SET);

fprintf(fp, "%s\n", new_data);

fclose(fp);

return(0);

}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルサイズ変更又はEOFの挿入 23403 まきじ 2005/09/29 16:46:53


No.23403

Re:ファイルサイズ変更又はEOFの挿入
投稿者---まきじ(2005/09/29 16:46:53)


>文字列が複数格納されているファイルに対して
>先頭の文字列を削除して最後尾に追加するプログラムを作っています。

テキストモードで開いたストリームに対しての fseek() は
第三引数が SEEK_SET の時は、第二引数は ftel() によって
得られた値でなければなりません。

fgets() 一行ずつ読み込み、先頭の行以外の時だけ書き込み処理をして
最後に新たに追加する文字列を書き込めば良いのでは?
最後にファイル名の変更とファイルの削除が必要になりますが・・。
rename() と remove() でできます。


この投稿にコメントする

削除パスワード

No.23404

Re:ファイルサイズ変更又はEOFの挿入
投稿者---果林(2005/09/29 16:59:09)


まきじさん回答ありがとうございます。

>fgets() 一行ずつ読み込み、先頭の行以外の時だけ書き込み処理をして
>最後に新たに追加する文字列を書き込めば良いのでは?
>最後にファイル名の変更とファイルの削除が必要になりますが・・。
>rename() と remove() でできます。

これは新たにファイルを作って転写。
旧ファイルを削除
新ファイルを旧ファイル名にリネーム
ということですか?

そうですとファイルはサイズを大きくすることはできても
小さくするとはできないという認識でよろしいのでしょうか?


この投稿にコメントする

削除パスワード

No.23406

Re:ファイルサイズ変更又はEOFの挿入
投稿者---まきじ(2005/09/29 17:03:15)


>旧ファイルを削除
>新ファイルを旧ファイル名にリネーム
>ということですか?

そうです。

>そうですとファイルはサイズを大きくすることはできても
>小さくするとはできないという認識でよろしいのでしょうか?

ファイルの内容が変わればサイズは変わるでしょ?


この投稿にコメントする

削除パスワード

No.23408

解決
投稿者---果林(2005/09/29 17:06:29)


まきじさんありがとうございました。


この投稿にコメントする

削除パスワード

No.23407

Re:ファイルサイズ変更又はEOFの挿入
投稿者---Blue(2005/09/29 17:04:28)


ファイルポインタ(FILE)をつかうと
ファイルの後に追記はできますが、挿入・削除はできないです。
挿入・削除したい場合は、新たにファイルを作るしかないです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧