掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板2

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

No.29986

ファイルの先頭に空きを作るには
投稿者---やすお(2007/03/29 02:38:07)


宿題でmp3ファイルのID3(ver2)を書き換えるプログラムというのがでました。
元ファイルにID3が存在する場合は単純に書き換えるだけなのでいいのですが、
存在しない場合、ファイルの先頭に空き領域を作らなくてはいけませんよね?
そこで自分は次の関数を用意しました。

int slide(FILE *fp,long a,long b,long length)
{   /*ファイルのaバイトの位置からbまでをlengthバイト後ろにずらし、
    関数を抜ける時、ファイルポインタは先頭に移動しておく*/
    long bufsize=640000;
    unsigned char *buf;
    long pos;

    if((buf=(unsigned char *)malloc(bufsize)) == NULL)
    {
        printf("メモリ確保失敗\n");
        return 0;
    }

    fseek(fp,b,SEEK_SET);

    for(pos=ftell(fp);pos>a;)
    {
        if(pos-bufsize<a)
        {
            bufsize=pos-a;
            pos=a;
        }else
        {
            pos-=bufsize;
        }
        fseek(fp,pos,SEEK_SET);
        fread(buf,bufsize,1,fp);
        fseek(fp,pos+length,SEEK_SET);
        fwrite(buf,bufsize,1,fp);
    }

    free(buf);
    fseek(fp,0,SEEK_SET);/*先頭に移動*/
    return 1;
}




この関数を使って一応目的は達成できたのですが
ファイルの先頭に空きを作る、もっと効率のいい方法はないものでしょうか?



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの先頭に空きを作るには 29987 ぽへぇ 2007/03/29 07:51:55


No.29987

Re:ファイルの先頭に空きを作るには
投稿者---ぽへぇ(2007/03/29 07:51:55)


>もっと効率のいい方法はないものでしょうか?
何をもって「効率がいい」と評価するかによるのでは?
何の制約もなければ(私なら)新しいファイルを一個作って

空白を書く
(空白の後に)元ファイルの内容をコピーする

のようにします。



この投稿にコメントする

削除パスワード

No.29988

Re:ファイルの先頭に空きを作るには
投稿者---やすお(2007/03/29 10:51:54)


ぽへぇ様。レスありがとうございます。

ファイルの先頭や途中に都合よくデータを挿入する方法はないものかと思ったのですが、

>空白を書く
>(空白の後に)元ファイルの内容をコピーする

↑自分もこの方法でやることにしました。
ありがとうございました


この投稿にコメントする

削除パスワード

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