ファイルの書き込み

テキストファイルの書き込み

fputc.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 [fputc]
  
  書式: int fputc(int c, FILE *fp)
  機能: 1 文字ずつファイルへ書き込み
  引数: int c: 出力する 1 文字
	FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 出力した文字を返し,
          失敗すると, EOF(-1) を返す.
*/

#include <stdio.h>
#include <string.h> /* strlen */

int main(void){
  FILE *fp;
  char *fname = "fputc.txt";
  char *str = "Hello C\nThe C Programming Language\nTest C";
  int i;
  
  fp = fopen(fname, "w");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  for(i = 0; i < strlen(str); i++){
    fputc(str[i], fp);
  }
  
  fclose(fp);
  printf("%s ファイル書き込みが終了した\n", fname);

  return 0;
}

fputc.c の実行結果は:

[cactus:~/code_c/refer]% ./fputc
fputc.txt ファイル書き込みが終了した

fputc.txt

Hello C
The C Programming Language
Test C

putc.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 [putc]
  
  書式: int putc(int c, FILE *fp)
  機能: fputc() と同じ機能の関数で, マクロで定義されていること
        のみ異なる. 1 文字ずつファイルへ書き込み
  引数: int c: 出力する 1 文字
	FILE *fp: ファイル (ストリーム) ポインタ
  戻り値: 成功すると, 出力した文字を返し,
          失敗すると, EOF(-1) を返す.
*/

#include <stdio.h>
#include <string.h> /* strlen */

int main(void){
  FILE *fp;
  char *fname = "putc.txt";
  char *str = "Hello C\nThe C Programming Language\nTest C";
  int i;
  
  fp = fopen(fname, "w");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  for(i = 0; i < strlen(str); i++){
    putc(str[i], fp);
  }
  
  fclose(fp);
  printf("%s ファイル書き込みが終了した\n", fname);

  return 0;
}

putc.c の実行結果は:

[cactus:~/code_c/refer]% ./putc
putc.txt ファイル書き込みが終了した

putc.txt

Hello C
The C Programming Language
Test C

fputs.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 [fputs]
  
  書式: int fputs(const char *str, FILE *fp)
  機能: 文字列を, まとめてファイル書き込み
  引数: const char *format: 出力する文字列
	FILE *fp: ファイル (ストリーム)ポインタ
  戻り値: 成功すると, 0 以上の値を返し,
          失敗すると, EOF(-1) を返す.
*/
/*
  fputs() は, 文字列をまとめて書き込むのでループさせる必要
  はない.
*/

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "fputs.txt";
  char *str = "Hello C\nThe C Programming Language\nTest C";
  
  fp = fopen(fname, "w");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fputs(str, fp);
  
  fclose(fp);
  
  printf("%s ファイル書き込みが終了した\n", fname);

  return 0;
}

fputs.c の実行結果は:

[cactus:~/code_c/refer]% ./fputs
fputs.txt ファイル書き込みが終了した

fputs.txt

Hello C
The C Programming Language
Test C

CSV ファイルの書き込み

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

#include <stdio.h>

int main(void){
  FILE *fp;
  char *fname = "fprintf.csv";
  
  char *s1 = "test01";
  char *s2 = "test02";
  char *s3 = "test03";
  
  int n1 = 10;
  int n2 = 20;
  int n3 = 30;
  
  float f1 = 1.0;
  float f2 = 2.0;
  float f3 = 3.0;
  
  fp = fopen(fname, "w");
  if (fp == NULL){
    printf("%s ファイルが開けない\n", fname);
    return -1;
  }

  fprintf(fp, "%s, %d, %d, %f, %f\n", s1, n1, n1+1, f1, f1 + 0.1);
  fprintf(fp, "%s, %d, %d, %f, %f\n", s2, n2, n2+1, f2, f2 + 0.1);
  fprintf(fp, "%s, %d, %d, %f, %f\n", s3, n3, n3+1, f3, f3 + 0.1);
  
  fclose(fp);
  printf("%s ファイル書き込みが終了した\n", fname);

  return 0;
}

fprintf.c の実行結果は:

[cactus:~/code_c/refer]% ./fprintf
fprintf.csv ファイル書き込みが終了した

fprintf.csv

test01, 10, 11, 1.000000, 1.100000
test02, 20, 21, 2.000000, 2.100000
test03, 30, 31, 3.000000, 3.100000

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

rect.data

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

fwrite.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
/*
  stdio.h [fwrite]
  
  書式: size_t fwrite(const void *buf, size_t size, size_t num, FILE *fp)
  機能: バイナリファイルを書き込む
  引数:	const void *buf: バイナリデータを書き込むバッファ
        size_t size: データ要素 1 個のサイズ
	size_t num: データの個数
	FILT :fp: ファイル (ストリーム) ポインタ
  戻り値: 書き込んだデータ要素の個数を返す
*/

#include <stdio.h>

int main(void){
  FILE *fpr;
  FILE *fpw;
  char *fname_r = "rect.data";
  char *fname_w = "rect_copy.data";

  unsigned char buf[10000];
  int size;

  fpr = fopen(fname_r, "rb");
  if (fpr == NULL){
    printf("読み込み用 %s ファイルが開けない\n", fname_r);
    return -1;
  }

  fpw = fopen(fname_w, "wb");
  if (fpw == NULL){
    printf("書き込み %s ファイルが開けない\n", fname_w);
    return -1;
  }
  
  size = fread(buf, sizeof(unsigned char), 10000, fpr);
  fwrite(buf, sizeof(unsigned char) ,size, fpw);
  
  fclose(fpr);
  fclose(fpw);
  
  printf("%s ファイルのコピーが終了した\n", fname_w);

  return 0;
}

fwrite.c の実行結果は:

[cactus:~/code_c/refer]% ./fwrite
rect_copy.data ファイルのコピーが終了した

rect_copy.data

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

可変個引数をファイルへ書き込み

vfprintf.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
/*
  stdio.h [vfprintf]
  
  書式: int vfprintf(FILE *fp, const char *format, va_list *arg)
  機能: 可変個引数リストを書式付きでファイルに出力
  引数:	FILE *fp: ファイル (ストリーム) ポインタ
        const char *format: 書式文字列
	va_list *arg: 可変個引数リスト
  戻り値: 成功すると, 出力したバイト数を返し,
          失敗すると, 負値を返す.
*/

#include <stdio.h>
#include <stdarg.h> /* va_list */

void func(int num, ...);

int main(void){
  func(5, 'a', 0.123, 10, 123, "ABC");
  return 0;
}

void func(int num, ...){
  va_list arg;
  FILE *fp;
  char *fname = "vfprintf.txt";

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

  /* 可変引数リスト初期化 */
  va_start(arg, num);

  /* 可変個の引数をファイルへ出力 */
  vfprintf(fp, "%c, %0.3f, %d, %#x, %s", arg);
  printf("%s ファイルへ出力した\n", fname);

  /* 可変引数リスト終了 */
  va_end(arg);

  fclose(fp);
}

vfprintf.c の実行結果は:

[cactus:~/code_c/refer]% ./vfprintf
vfprintf.txt ファイルへ出力した

vfprintf.txt

a, 0.123, 10, 0x7b, ABC