ftruncate() - ファイルの切り捨て

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1a
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX1_SOURCE 2
#include <unistd.h>

int ftruncate(int fildes, off_t length);

機能説明

ftruncate() 関数は、オープン・ファイル記述子 fildes で示されるファイルを length で示される長さに切り捨てます。fildes は、書き込み用にオープンされる通常のファイルでなければな りません。ファイル・サイズが length を超えると、超過分のデータは廃棄さ れます。ファイル・サイズが length よりも小さいと、古い長さと新しい長さの間 のバイトがゼロとして読み取られます。ファイルのサイズへの変更は、ファイル・オフセットには影響を与えません。

XPG4.2 の特殊な動作: ftruncate() 関数によってファイル・サイズがプロセスのソフト・ファイル ・サイズ限度を超えることになる場合、ftruncate() は失敗 し、SIGXFSZ シグナルがそのプロセスに対して生成されます。

正常に実行された場合、ftruncate() 関数は、ファイル の st_ctime フィールドと st_mtime フィールドに マークを付けます。

正常に実行されなかった場合、ftruncate() 関数はファイルを変更しません。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

ftruncate() 関数は、正常終了時には 0 を戻します。

正常に実行されなかった場合、ftruncate() 関数は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
fildes が、有効なオープン・ファイル記述子ではありません。
EFBIG
長さの引数が、最大ファイル・サイズより大きくなっています。
EINTR
XPG4.2 の追加事項: 関数の実行中にシグナルを取得しました。
EINVAL
fildes は、通常のファイルを参照していません。それは読み取り専 用でオープンされたか、または指定された長さが正しくありません。
EIO
XPG4.2 に関して追加: ファイル・システムの読み取り中または書き込み中に入出力エラーが発生しました。
EROFS
ファイルが読み取り専用ファイル・システムにあります。

CELEBF49
⁄* CELEBF49 *⁄
#define _POSIX_SOURCE
#include <fcntl.h>
#include <sys⁄stat.h>
#include <sys⁄types.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>
#include <stdlib.h>

#define string_len 1000

main() {
  char *mega_string;
  int  fd, ret;
  char fn[]="write.file";
  struct stat st;

  if ((mega_string = (char*) malloc(string_len)) == NULL)
    perror("malloc() error");
  else if ((fd = creat(fn, S_IWUSR)) < 0)
    perror("creat() error");
  else {
    memset(mega_string, '0', string_len);
    if ((ret = write(fd, mega_string, string_len)) == -1)
      perror("write() error");
    else {
      printf("write() wrote %d bytes¥n", ret);
      fstat(fd, &st);
      printf("the file has %ld bytes¥n", (long) st.st_size);
      if (ftruncate(fd, 1) != 0)
        perror("ftruncate() error");
      else {
        fstat(fd, &st);
        printf("the file has %ld bytes¥n", (long) st.st_size);
      }
    }
    close(fd);
    unlink(fn);
  }
}
出力:
write() wrote 1000 bytes
the file has 1000 bytes
the file has 1 bytes

関連情報