ここでは、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; }