ファイル関連

ファイル位置の取得

fgetpos.txt

Hello C World
Test C

fgetpos.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
  stdio.h [fgetpos]
  
  書式: int fgetpos(FILE *fp, fpos_t *pos)
  機能: ファイル位置の取得
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
        fpos_t *pos: ファイル位置格納
  戻り値: 成功すると, 0 を返し,
          失敗すると, 0 以外を返す.
*/

/*
  fpos_t 型とは, ファイル位置を格納するための型だが,
  typedef long fpos_t というように, 実際に long 型
*/

/*
  fopen() を使用してファイルを読み取りモード "r" で開いた直後では,
  ファイル位置は先頭の 0 である.
  そこから, fgetc() で 5 文字読み取った後では, ファイル位置は 5 となる.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "fgetpos.txt";
  int i, c;
  fpos_t pos;

  fp = fopen(fname, "r");
  if(fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fgetpos(fp, &pos);
  printf("ファイル位置 %d\n", (int)pos);

  for(i = 0; i < 5; i++){
    c = fgetc(fp);
    printf("%c\n", c);
  }

  fgetpos(fp, &pos);
  printf("ファイル位置 %d\n", (int)pos);

  fclose(fp);

  return 0;
}

fgetpos.c の実行結果は:

[cactus:~/code_c/refer]% ./fgetpos
ファイル位置 0
H
e
l
l
o
ファイル位置 5

ファイル位置の設定

fsetpos.txt

Hello C World
Test C

fsetpos.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
  stdio.h [fsetpos]
  
  書式: int fsetpos(FILE *fp, const fpos_t *pos)
  機能: ファイル位置の取得
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
        const fpos_t *pos: ファイル位置格納
  戻り値: 成功すると, 0 を返し,
          失敗すると, 0 以外を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "fsetpos.txt";
  int i, c;
  fpos_t pos;

  fp = fopen(fname, "r");
  if(fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  pos = 6;
  fsetpos(fp, &pos);

  for(i = 0; i < 7; i++){
    c = fgetc(fp);
    printf("%c\n", c);
  }

  fgetpos(fp, &pos);
  printf("ファイル位置 %d\n", (int)pos);

  fclose(fp);

  return 0;
}

fsetpos.c の実行結果は:

[cactus:~/code_c/refer]% ./fsetpos
C

W
o
r
l
d
ファイル位置 13

ファイル位置の取得 2

ftell.txt

Hello C World
Test C

ftell.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
  stdio.h [ftell]
  
  書式: long ftell(FILE *fp)
  機能: 現在のファイル位置の取得
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 現在のファイル位置を返し,
          失敗すると, -1 を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "ftell.txt";
  long sz;

  fp = fopen(fname, "rb");
  if(fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fseek(fp, 0, SEEK_END);
  sz = ftell(fp);
  printf("%s ファイルのサイズ: %d バイト\n", fname, (int)sz);

  fclose(fp);

  return 0;
}

ftell.c の実行結果は:

[cactus:~/code_c/refer]% ./ftell
ftell.txt ファイルのサイズ: 21 バイト

ファイル位置の設定 2

fseek.txt

Hello C World
Test C

fseek.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
  stdio.h [fseek]
  
  書式: int fseek(FILE *fp, long offset, int origin)
  機能: ファイル位置を原点位置から移動させ設定する
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
        long offset: 指定位置からのズレ量
	int origin: 原点位置の種類
  戻り値: 成功すると, 0 を返し,
          失敗すると, 0 以外を返す.
*/

/*
  第 3 引数 origin の種類:
  SEEK_SET: ファイルの先頭位置を指定
  SEEK_CUR: ファイルの現在位置を指定
  SEEK_END: ファイルの終端位置を指定
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "fseek.txt";
  fpos_t sz;

  fp = fopen(fname, "rb");
  if(fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fseek(fp, 0, SEEK_END);
  fgetpos(fp, &sz);
  printf("%s ファイルのサイズ: %d バイト\n", fname, (int)sz);

  fclose(fp);

  return 0;
}

fseek.c の実行結果は:

[cactus:~/code_c/refer]% ./fseek
fseek.txt ファイルのサイズ: 21 バイト

ファイル位置を先頭に戻す

rewind.txt

Hello C World
Test C

rewind.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
  stdio.h [rewind]
  
  書式: void rewind(FILE *fp)
  機能: ファイル位置を先頭に戻す
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: なし
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "rewind.txt";
  fpos_t pos;

  fp = fopen(fname, "rb");
  if(fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fseek(fp, 0, SEEK_END);
  fgetpos(fp, &pos);
  printf("%s ファイル位置は: %d です\n", fname, (int)pos);

  rewind(fp);
  fgetpos(fp, &pos);
  printf("ファイル位置は %d です\n", (int)pos);

  fclose(fp);

  return 0;
}

rewind.c の実行結果は:

[cactus:~/code_c/refer]% ./rewind
rewind.txt ファイル位置は: 21 です
ファイル位置は 0 です

ファイルの削除

remove.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
  stdio.h [remove]
  
  書式: int remove(const char *filename)
  機能: ファイルの削除
  引数:	const char *filename: 削除するファイル名
  戻り値: 成功すると, 0 を返し,
          失敗すると, 0 以外を返す.
*/

#include <stdio.h>

int main(void){
  char *fname = "remove.txt";

  if(remove(fname) == 0){
    printf("%s ファイルを削除した\n", fname);
  }else{
    printf("ファイル削除に失敗した\n");
  }

  return 0;
}

remove.c の実行結果は:

[cactus:~/code_c/refer]% ./remove
remove.txt ファイルを削除した
[cactus:~/code_c/refer]% ./remove
ファイル削除に失敗した

ファイル名の変更

rename.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
  stdio.h [rename]
  
  書式: int rename(const char *oldname, const char *newname)
  機能: ファイル名, フォルダ名の変更と移動
  引数:	const char *oldname: 元のファイル名 (or フォルダ名)
        const char *newname: 新しいファイル名 (or フォルダ名)
  戻り値: 成功すると, 0 を返し,
          失敗すると, 0 以外を返す.
*/

#include <stdio.h>

int main(void){
  char *oldname = "old.txt";
  char *newname = "new.txt";

  if(rename(oldname, newname) == 0){
    printf("%s から %s に名前を変更/移動した\n", oldname, newname);
  }else{
    printf("名前の変更/移動に失敗した\n");
  }

  return 0;
}

rename.c の実行結果は:

[cactus:~/code_c/refer]% ./rename
old.txt から new.txt に名前を変更/移動した
[cactus:~/code_c/refer]% ./rename
名前の変更/移動に失敗した

一時ファイルの作成

tmpfile.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*
  stdio.h [tmpfile]
  
  書式: FILE *tmpfile(void)
  機能: 一時ファイル (テンポラリファイル) の作成
  引数:	なし
  戻り値: 成功すると, 一時ファイルポインタを返し,
          失敗すると, NULL を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char buf[100];
  char *str = "Hello Tempfile!\nテンポラリファイルテスト";

  fp = tmpfile();
  if(fp == NULL){
    printf("一時ファイル作成に失敗した\n");
    return -1;
  }else{
    printf("一時ファイルを作成した\n");
  }

  fputs(str, fp); /* 一時ファイルに文字列を書き込む */
  rewind(fp); /* ファイル位置を先頭に戻す */

  /* 一時ファイルから文字列を読み込む */
  while( fgets(buf, 100, fp) != NULL){
    printf("%s\n", buf);
  }

  return 0;
}

tmpfile.c の実行結果は:

cactus:~/code_c/refer]% ./tmpfile
一時ファイルを作成した
Hello Tempfile!

テンポラリファイルテスト

一時ファイル名の作成

tmpnam.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
  stdio.h [tmpnam]
  
  書式: char *tmpnam(char *name)
  機能: 一時ファイル (テンポラリファイル) の作成
  引数: char *name: L_tmpnam バイト数の配列に一時ファイルを格納
  戻り値: 引数に NULL を入れると, 戻り値に一時ファイル名を返す.
*/

/*
  L_tmpnam とは, 一時ファイル名のバイト数の最大値で,
  #define L_tmpnam で定義されている.
  また, 一時ファイル名を作成できる上限個数は,
  #define TMP_MAX で定義されている.
*/

#include <stdio.h>

int main(void){
  int i;
  char fname[L_tmpnam];

  for(i = 0; i < 5; i++){
    tmpnam(fname);
    printf("%s\n", fname);
  }

  return 0;
}

tmpnam.c の実行結果は:

[cactus:~/code_c/refer]% ./tmpnam
/var/tmp/tmp.0.jWrqJ4
/var/tmp/tmp.1.hCUxpj
/var/tmp/tmp.2.vHqyDu
/var/tmp/tmp.3.FKp2qZ
/var/tmp/tmp.4.yZ679Y

ファイルエラー判定

ferror.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
  stdio.h [ferror]
  
  書式: int ferror(FILE *fp)
  機能: ファイルのエラー状態を判定する
  引数: FILT *fp: ファイル (ストリーム) ポインタ
  戻り値: エラーの場合は, 0 以外を返し,
          正常な場合は, 0 を返す.
*/

/*
  feof
  書式: int feof(FILE *fp)
  機能: ファイルの終端 (EOF) 判定を行う
  引数: FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 終端の場合は, 0 以外を返し,
          終端でない場合, 0 を返す.
*/

/*
  clearerr
  書式: void clearerr(FILE *fp)
  機能: エラー状態をクリアする
  引数: FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: なし
*/

#include <stdio.h>
#include <stdlib.h>

int main(void){
  FILE *fp;
  char *fname = "ferror.txt";
  int c;
  
  if( (fp = fopen(fname, "w") ) == NULL ) {
    fprintf(stderr,"ファイルオープンエラー\n");
    exit(EXIT_FAILURE);
  }

  /* ファイル読み込み */
  c = fgetc(fp);

  if( ferror(fp) != 0 ){
    /* エラー発生 */
    printf("ファイルエラーが発生しました\n");
    
    /* エラー指示子をクリア */
    clearerr(fp);
  }
  fclose(fp);
  return 0;
}

ferror.c の実行結果は:

[cactus:~/code_c/refer]% ./ferror
ファイルエラーが発生しました