[ C言語 ] ファイルのサイズを切り詰める ( truncate / ftruncate )

Pocket

ここでは、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;
}
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *