ファイルの読み込み

テキストファイルの読み込み

test1.txt

Hello C World
The C Programming Language
Test C

fgetc.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
/*
  stdio.h [fgetc]
  
  書式: int fgetc(FILE *fp)
  機能: ファイルから 1 文字ずつ読み込む
  引数: FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 読み込んだ 1 文字を返し,
          ファイル終端の場合は, EOF (-1) を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "test1.txt";
  int c;

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

  printf("--fgetc--\n");
  while( (c = fgetc(fp)) != EOF ){
    printf("%c", c);
  }
  
  fclose(fp);

  return 0;
}

fgetc.c の実行結果は:

[cactus:~/code_c/refer]% ./fgetc
--fgetc--
Hello C World
The C Programming Language
Test C

getc.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
/*
  stdio.h [getc]
  
  書式: int getc(FILE *fp)
  機能: fgetc() と同じ機能の関数で, マクロ定義されていることのみ
        異なる. ファイルから 1 文字ずつ読み込む.
  引数: FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 読み込んだ 1 文字を返し,
          ファイル終端の場合は, EOF (-1) を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "test1.txt";
  int c;

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

  printf("--getc--\n");
  while( (c = getc(fp)) != EOF ){
    printf("%c", c);
  }
  
  fclose(fp);

  return 0;
}

getc.c の実行結果は:

[cactus:~/code_c/refer]% ./getc
--getc--
Hello C World
The C Programming Language
Test C

fgets.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 [fgets]
  
  書式: int fgets(char *str, int num, FILE *fp)
  機能: ファイルから 1 行ずつ読み込む
  引数: char *str: 文字列を受け取るバッファ
        int num; 文字列を受け取るバイト数
	FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 読み込んだ文字列のポインタを返し,
          失敗すると, NULL を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "test1.txt";
  char s[100];

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

  printf("--fgets--\n");
  while( fgets(s, 100, fp) != NULL ){
    printf("%s", s);
  }
  
  fclose(fp);

  return 0;
}

fgets.c の実行結果は:

[cactus:~/code_c/refer]% ./fgets
--fgets--
Hello C World
The C Programming Language
Test C

空白区切りファイルの読み込み

space.txt

test01 10 11 1.0 1.1
test02 20 21 2.0 2.1
test03 30 31 3.0 3.1

fscanf.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
/*
  stdio.h [fscanf]
  
  書式: int fscanf(FILE *fp, const char *format, ...)
  機能: 書式付き (空白やカンマ区切り) ファイルを読み込む
  引数: FILE *fp: ファイル (ストリーム) ポインタ
        const char *format: 書式文字列
	...: 可変個引数. 書式で指定された変数をカンマ区切りで指定
  戻り値: 成功すると, 読み込んだ項目数を返し,
          失敗すると, EOF(-1) を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "space.txt";
  char s[100];
  int ret, n1, n2;
  float f1, f2;
  
  fp = fopen(fname, "r");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  printf("--fscanf--\n");
  while( (ret = fscanf(fp, "%s %d %d %f %f", s, &n1, &n2, &f1, &f2)) != EOF ){
    printf("%s %d %d %f %f\n", s, n1, n2, f1, f2);
  }
  
  fclose(fp);

  return 0;
}

fscanf.c の実行結果は:

[cactus:~/code_c/refer]% ./fscanf
--fscanf--
test01 10 11 1.000000 1.100000
test02 20 21 2.000000 2.100000
test03 30 31 3.000000 3.100000

CSV ファイルの読み込み

comma.csv

test01,10,11,1.0,1.1
test02,20,21,2.0,2.1
test03,30,31,3.0,3.1

fscanf-csv.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
/*
  stdio.h [fscanf]
  
  書式: int fscanf(FILE *fp, const char *format, ...)
  機能: 書式付き (空白やカンマ区切り) ファイルを読み込む
  引数: FILE *fp: ファイル (ストリーム) ポインタ
        const char *format: 書式文字列
	...: 可変個引数. 書式で指定された変数をカンマ区切りで指定
  戻り値: 成功すると, 読み込んだ項目数を返し,
          失敗すると, EOF(-1) を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "comma.csv";
  char s[100];
  int ret, n1, n2;
  float f1, f2;
  
  fp = fopen(fname, "r");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  printf("--fscanf-csv--\n");
  /* %[^,]: ',' 以外の文字を読み込む */
  /* %[^abc]: "abc" 以外の文字を読み込む */
  while( (ret = fscanf(fp,"%[^,],%d,%d,%f,%f", s, &n1, &n2, &f1, &f2)) != EOF ){
    printf("%s %d %d %f %f", s, n1, n2, f1, f2);
  }
  
  fclose(fp);

  return 0;
}

fscanf-csv.c の実行結果は:

[cactus:~/code_c/refer]% ./fscanf-csv
--fscanf-csv--
test01 10 11 1.000000 1.100000
test02 20 21 2.000000 2.100000
test03 30 31 3.000000 3.100000[cactus:~/code_c/refer]%

バイナリファイルの読み込み

rect.data

1111111111111111
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
1111111111111111

fread.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 [fread]
  
  書式: size_t fread(void *buf, size_t size, size_t num, FILE *fp)
  機能: バイナリファイルを読み込む
  引数: void *buf: バイナリデータお受け取るバッファ
        size_t size: データ要素 1 個のサイズ
	size_t num: データの個数
	FILE *fp: ファイル (ストリーム) ポインタ
	...: 可変個引数. 書式で指定された変数をカンマ区切りで指定
  戻り値: 成功すると, 読み込んだデータの個数を返し,
          データがないと, 0 を返す.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "rect.data";
  unsigned char buf[10000];
  int i, size;
  
  fp = fopen(fname, "rb");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  size = fread(buf, sizeof(unsigned char), 10000, fp);

  for(i = 0; i < size; i++){
    if(i % 17 == 0) printf("\n");
    printf("%02X ", buf[i]);
  }
  printf("\n");
  
  fclose(fp);

  return 0;
}

fread.c の実行結果は:

[cactus:~/code_c/refer]% ./fread

31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0A
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 0A