ファイル操作関数

ファイル操作

 ファイルは、
  1. オープン
    以下の操作で用いるファイルポインタ(FILE *)(ストリームという)を得る
  2. 読み書き
    ストリーム(FILE *)に対して入出力を行なう
  3. クローズ
    ストリーム(FILE *)を解消する
という手順で操作する。

 標準入出力ファイル

ファイル操作関数

 オープン

 クローズ

 末尾(End Of File)判定

 読み書き位置変更

 読み書き位置取得

 読み書き

 一掃(flush)

エラー処理

 終了関数

HEXダンプを作ってみよう

/* ファイルの中身を16進数で表示する */
#include <stdio.h>

main()
{
	char	fname[40];
	FILE	*fp;
	int	col;
	int	c;

	printf("Input Filename: ");
	scanf("%s", fname );

	fp = fopen( fname, "rb");
	col = 0;
	while( feof(fp) == 0 )
	{
		if( col == 0 )
			printf("%04x: ", ftell(fp) );
		c = fgetc(fp) & 0xFF;
		printf("%02x ", c );

		col++;
		if( col > 15 )
		{
			printf("\n");
			col = 0;
		}
	}
	printf("\n");
	fclose(fp);
}
/* end of hd1.c */

例外処理をきちんとやろう

/* ファイルの中身を16進数で表示する */
#include <stdio.h>

main()
{
	char	fname[40];
	FILE	*fp;
	int	col;
	int	c;

	printf("Input Filename: ");
	scanf("%s", fname );

	if( !(fp = fopen( fname, "rb")) )
	{
		printf("\"%s\" not found!", fname );
		exit(1);
	}
	col = 0;
	while( feof(fp) == 0 )
	{
		if( col == 0 )
			printf("%04x: ", ftell(fp) );
		c = getc(fp) & 0xFF;
		printf("%02x ", c );

		col++;
		if( col > 15 )
		{
			printf("\n");
			col = 0;
		}
	}
	printf("\n");
	fclose(fp);
}
/* end of hd2.c */

ASCII文字ならば横に表示してみよう

/* ファイルの中身を16進数で表示する */
#include <stdio.h>
#include <ctype.h>

main()
{
	char	fname[40];
	FILE	*fp;
	int	col;
	int	c;
static	char	str[17];

	printf("Input Filename: ");
	scanf("%s", fname );

	if( !(fp = fopen( fname, "rb")) )
	{
		printf("\"%s\" not found!", fname );
		exit(1);
	}
	col = 0;
	while( feof(fp) == 0 )
	{
		if( col == 0 )
			printf("%04x: ", ftell(fp) );
		c = getc(fp) & 0xFF;
		printf("%02x ", c );
		str[col] = isprint(c) ? c : '.';

		col++;
		if( col > 15 )
		{
			printf(" %s\n", str );
			col = 0;
		}
	}
	if( col > 0 )
	{
		str[col] = '\0';
		while( col++ < 16 )
			printf("   ");
		printf(" %s\n", str );
	}
	fclose(fp);
}
/* end of hd3.c */

ファイル操作の練習問題へ