truncate関数は、ファイルの容量を指定した大きさに変更します。なお、現状の容量が指定された容量より大きい場合は、指定された容量に切り詰め、指定された容量より小さい場合は、ヌル文字(’\0’)を埋め込みます。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <unistd.h>
int truncate(const char *path, off_t length);

*pathは容量を変更するファイルをパス名で指定します。
lengthはバイト単位の容量を指定します。

戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。

容量を変更するファイルは書き込み可能な状態でなければなりません。また、容量を変更すると、ファイルの更新日時も変わります。

プログラム 例

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  int    new_size;

  if (argc == 3) {
    /* 新しい容量 */
    new_size = atoi(*(argv + 2));
    if (truncate(*(argv + 1), new_size) == 0) {
      printf('%sの容量を%dバイトにしました\n', *(argv + 1), new_size);
    }
    else {
      perror('main ');
      return 1;
    }
  }
  else {
    fprintf(stderr, 'main : 実行時引数の数が不当です\n');
    return 1;
  }

  return 0;
}

例の実行結果

$ ls -l temp_12.txt
-rw-r--r-- 1 user users 20 2008-08-12 10:01 temp_12.txt
$ od -xc temp_12.txt
0000000 6548 6c6c 206f 6f57 6c72 2164 2e21 420a
          H   e   l   l   o       W   o   r   l   d   !   !   .  \n   B
0000020 6579 0a2e
          y   e   .  \n
0000024
$
$ ./truncate.exe temp_12.txt 40
temp_12.txtの容量を40バイトにしました
$
$ ls -l temp_12.txt
-rw-r--r-- 1 user users 40 2008-08-12 10:06 temp_12.txt
$ od -xc temp_12.txt
0000000 6548 6c6c 206f 6f57 6c72 2164 2e21 420a
          H   e   l   l   o       W   o   r   l   d   !   !   .  \n   B
0000020 6579 0a2e 0000 0000 0000 0000 0000 0000
          y   e   .  \n  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040 0000 0000 0000 0000
         \0  \0  \0  \0  \0  \0  \0  \0
0000050
$
$ ./truncate.exe temp_12.txt 0
temp_12.txtの容量を0バイトにしました
$
$ ls -l temp_12.txt
-rw-r--r-- 1 user users 0 2008-08-12 10:06 temp_12.txt
$ od -xc temp_12.txt
0000000
$