- ベストアンサー
ファイル末尾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をいれる -> ファイルを閉じる みたいな感じでやるつもりだったのですが、うまくいきませんでした。 後者のやり方や「私ならこうする!」等アドバイスがありましたら、是非お聞かせください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Win32APIでなら SetEndOfFile() でしょうか。 それともCの標準関数だけでしょうか?
その他の回答 (2)
- KamoPlat
- ベストアンサー率46% (23/50)
> 一応ソース書いておきます。 > こんなんでいいのでしょうか? はい。大丈夫です。 コンパイラによってはインクルードファイルがどーのとか、 引数の検査とかありますが、基本的には問題ないはずです。 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でしか使えない機能だということと、バージョンによって使えなかったり引数がちがったりすることがあることを忘れなければいいかと思います。
お礼
引数の処理を入れ完成としたいと思います。 ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
stat関数を使用すると、そのファイルのサイズが判ります。 判ったサイズ-10バイト分までを、コピーしたファイルを作り、その後リネームしてはいかがでしょうか。
お礼
そういった関数もあるのですね。 これから調べてみます。 ありがとうございました。
お礼
ありがとうございます。 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; } ----------------------------------------