ここでは、C言語においてファイルサイズの切り詰めを行うサンプルコードを掲載しています。また、おまけとして低水準システムコールを使用したバイナリデータの書き込みのサンプルも掲載しています。
スポンサーリンク
ファイルサイズを切り詰める ( ftruncate / truncate )
ファイルサイズを一定のサイズに切り詰めるには、truncate または ftruncate 関数を使用します。なお、切り詰めるサイズよりもファイルが小さい場合は、実装依存だが伸長されることが多いです。いずれの関数もファイルが存在しない場合にはエラーとなります。
ftruncate 関数
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
int fd;
// 書き込み権限が必要
fd = open("./ftruncate.txt", O_WRONLY );
if(fd < 0) {
perror("open");
return -1;
}
if(ftruncate(fd, 300) < 0) {
perror("ftruncate()");
return -1;
}
close(fd);
return 0;
}
truncate 関数
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char** argv)
{
if(truncate("./truncate.txt", 400) < 0) {
perror("truncate()");
return -1;
}
return 0;
}
バイナリデータの書き込みサンプル
open, write, close システムコールを使用したバイナリデータの書き込みサンプルになります。詳細はコメントを参照ください。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
int fd; // ファイルディスクリプタ
int ret; // リターン値
char buf[4]; // バッファ
/*
* ファイルをオープンする
* ファイルが存在しない場合は、新規作成するので
* 第3パラメータでパーミッションを設定している
*/
fd = open("./test.bin_and_text", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR );
if(fd < 0) {
perror("open");
return -1;
}
/*
* ファイルにバイナリデータを書き込む('0x00000000')
* 文字列の '0' ではなく 0x00 で初期化
*/
memset(buf, 0, sizeof(buf));
ret = write(fd, buf, sizeof(buf));
if(ret < 0) {
perror("perror()");
return -1;
}
/*
* ファイルにテキストデータを書き込む(文字列の '0000')
* シングルコーテーションで囲むと文字列 '0' で初期化される
*/
memset(buf, '0', sizeof(buf));
ret = write(fd, buf, sizeof(buf));
if(ret < 0) {
perror("perror()");
return -1;
}
// ファイルをクローズする
close(fd);
return 0;
}