• ベストアンサー

ファイル末尾10バイトを削る

ファイルを開き、末尾10バイトを削り、上書きする というプログラムを作成しています。 とりあえず、以下のようなソースが出来ました。 ------------------------------------------------------------------ ifp = fopen( "openfile.dat", "rb"); ofp = fopen( "outfile.dat", "wb" ); fseek( ifp, -10, SEEK_END ); pos_end = ftell( ifp ); fseek( ifp, 0, SEEK_SET ); for( pos_now = ftell( ifp ) ; pos_now < pos_end; pos_now = ftell( ifp )){    rCnt = fread( pbuf, sizeof( char ), 1, ifp );    f( rCnt == EOF ) break;    fwrite( pbuf, sizeof( char ), 1, ofp ); } fclose( ifp ); *(openfile削除) *(リネーム処理:outfile.dat -> openfile.dat) 以下略 ------------------------------------------------------------------ ソースにあるとおり、 ファイルを開く -> ファイルの末尾10バイト目を記憶する。 -> アウトファイルを開く -> 記憶した位置までコピーする -> オープンファイルの削除 -> リネーム処理 という順番で処理を行っています。 本来は、 ファイルを開く -> ファイルの末尾10バイト目にEOFをいれる -> ファイルを閉じる みたいな感じでやるつもりだったのですが、うまくいきませんでした。 後者のやり方や「私ならこうする!」等アドバイスがありましたら、是非お聞かせください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KamoPlat
  • ベストアンサー率46% (23/50)
回答No.1

Win32APIでなら SetEndOfFile() でしょうか。 それともCの標準関数だけでしょうか?

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpfileio/html/_win32_setendoffile.asp
lampH
質問者

お礼

ありがとうございます。 SetEndOfFile()を調べましたところ、 本当に簡単に作成することが出来ました。 Win32APIっていうのをあまり理解していないのですが、 これから勉強しようと思います。 一応ソース書いておきます。 こんなんでいいのでしょうか? ---------------------------------------- #include <windows.h> #include <stdio.h> int main(int argc, char **argv) {   HANDLE hFile;   hFile = CreateFile(  argv[1] , GENERIC_WRITE , 0 , NULL ,     OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL   );   if (hFile == INVALID_HANDLE_VALUE) {     printf("ファイルオープンエラー\n");     return 1;   }   SetFilePointer( hFile, -128, NULL, FILE_END );   SetEndOfFile( hFile );   CloseHandle(hFile);   return 0; } ----------------------------------------

その他の回答 (2)

  • KamoPlat
  • ベストアンサー率46% (23/50)
回答No.3

> 一応ソース書いておきます。 > こんなんでいいのでしょうか? はい。大丈夫です。 コンパイラによってはインクルードファイルがどーのとか、 引数の検査とかありますが、基本的には問題ないはずです。 Win32APIについては http://www.google.co.jp/search?hl=ja&q=win32api%E3%81%A8%E3%81%AF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr= 詳しくは↑あたりをさらってください。 基本的にWindowsでしか使えない機能だということと、バージョンによって使えなかったり引数がちがったりすることがあることを忘れなければいいかと思います。

lampH
質問者

お礼

引数の処理を入れ完成としたいと思います。 ありがとうございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

stat関数を使用すると、そのファイルのサイズが判ります。 判ったサイズ-10バイト分までを、コピーしたファイルを作り、その後リネームしてはいかがでしょうか。

lampH
質問者

お礼

そういった関数もあるのですね。 これから調べてみます。 ありがとうございました。

関連するQ&A