C言語のIO関数
C言語の低水準・高水準 および Win32API を使用したファイルの読み書き処理。
サンプルとしてコピー元とコピー先のファイル名を与えてそれぞれの関数を利用して内容をコピーを作成する関数。手元に残っていたのをそのまま転記。
低水準ファイル処理
1 |
/* **************************************************************** */
/* * インクルードファイル定義 * */
/* **************************************************************** */
#include <stdio.h> /* 標準 */
#include <io.h> /* 低水準 */
#include <fcntl.h> /* 低水準:許容操作種別 */
#include <sys/stat.h> /* 低水準:アクセス権 */
#include <sys/types.h> /* 低水準: */
/* **************************************************************** */
/* * 低水準ファイル処理 * */
/* **************************************************************** */
int rw_lo_proc(const char *ifname, const char *ofname){
int rd_fh, wt_fh; /* ファイルハンドル */
int size; /* 読み込みサイズ */
int ferr; /* 処理結果戻り値 */
char buff[512]; /* 格納場所 */
rd_fh = _open(ifname, _O_RDONLY | _O_SEQUENTIAL | _O_BINARY);
/* 読み込み専用、順次アクセス、バイナリ */
if(rd_fh == -1){
printf("ファイルオープンエラー(%s)\n", ifname);
return(-1);
}
wt_fh = _open(ofname, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY, _S_IREAD | _S_IWRITE);
/* 書き込み専用、新規、既存破棄、バイナリ */ /* 属性:読み書き */
if(wt_fh == -1){
printf("ファイルオープンエラー(%s)\n", ofname);
return(-1);
}
size = _read(rd_fh, buff, sizeof(buff));
while(ferr > 0){
ferr = _write(wt_fh, buff, size); /* ライト */
if(ferr == -1){ /* ファイル書き込み失敗の場合 */
printf("ファイルライトエラー RC=%d\n", ferr);
break;
}
size = _read(rd_fh, buff, sizeof(buff));
}
if(size == -1){ /* ファイル読み込み失敗の場合 */
printf("ファイルリードエラー\n");
}
if(rd_fh != -1){
_close(rd_fh); /* ファイルを閉じる */
}
if(wt_fh != -1){
_close(wt_fh); /* ファイルを閉じる */
}
return(0);
} |
高水準ファイル処理
1 |
/* **************************************************************** */
/* * インクルードファイル定義 * */
/* **************************************************************** */
#include <stdio.h> /* 標準 */
#include <stdlib.h> /* 標準 */
/* **************************************************************** */
/* * 高水準ファイル処理 * */
/* **************************************************************** */
int rw_hi_proc(const char *ifname, const char *ofname){
FILE *ifp, *ofp; /* ファイル管理 */
int size; /* 読み込みサイズ */
int ferr; /* 処理結果戻り値 */
char buff[512]; /* 格納場所 */
ifp = fopen(ifname, "rb");
if(ifp == (FILE *)NULL){
printf("ファイルオープンエラー(%s)\n", ifname);
return(-1);
}
ofp = fopen(ofname, "wb");
if(ofp == (FILE *)NULL){
printf("ファイルオープンエラー(%s)\n", ofname);
return(-1);
}
size = fread(buff, sizeof(buff), 1, ifp);
while(feof(ifp) == 0 && ferror(ifp) == 0){
size = fwrite(buff, size, 1, ofp);
if((ferror(ofp) != 0){
printf("ファイルライトエラー\n");
break;
}
size = fread(buff, sizeof(buff), 1, ifp);
}
if(ferror(ifp) != 0){
printf("ファイルリードエラー\n");
return(-1);
}
if(ofp != (FILE *)NULL){
ferr = fclose(ofp); /* ファイルを閉じる */
if(ferr != 0){
printf("ファイルクローズエラー(o)\n");
}
}
if(ifp != (FILE *)NULL){
ferr = fclose(ifp); /* ファイルを閉じる */
if(ferr != 0){
printf("ファイルクローズエラー(i)\n");
}
}
return(0);
} |
Win32APIファイル処理
1 |
/* **************************************************************** */
/* * インクルードファイル定義 * */
/* **************************************************************** */
#include <stdio.h> /* 標準 */
#ifdef WIN32 /* Win32 のみ */
#include <windows.h> /* Win32APIファイル関数 */
#endif /* WIN32 */
/* **************************************************************** */
/* * Win32APIファイル処理 * */
/* **************************************************************** */
#ifdef WIN32 /* Win32 のみ */
int rw_ap_proc(const char *ifname, const char *ofname){
HANDLE wt_fh, rd_fh; /* ファイルハンドル */
int ferr; /* 処理結果戻り値 */
unsigned long rw_size; /* 読み込み(読み込まれた)サイズ */
char buff[512]; /* 格納場所 */
rd_fh = CreateFile(ifname, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(rd_fh == INVALID_HANDLE_VALUE){
printf("ファイルオープンエラー\n");
return(-1);
}
wt_fh = CreateFile(ofname, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(wt_fh == INVALID_HANDLE_VALUE){
printf("ファイルオープンエラー\n");
return(-1);
}
ferr = ReadFile(rd_fh, buff, sizeof(buff), &rw_size, NULL);
while(ferr != 0 && rw_size != 0){
ferr = WriteFile(wt_fh, buff, rw_size, &rw_size, NULL);
if(ferr == 0){
printf("ファイルライトエラー\n");
break;
}
ferr = ReadFile(rd_fh, buff, sizeof(buff), &rw_size, NULL);
}
if(rw_size != 0){
printf("ファイルリードエラー\n");
return(-1);
}
if(wt_fh != INVALID_HANDLE_VALUE){
ferr = CloseHandle(wt_fh); /* ファイルを閉じる */
if(ferr == 0){
printf("ファイルクローズエラー(o)\n");
return(-1);
}
}
if(rd_fh != INVALID_HANDLE_VALUE){
ferr = CloseHandle(rd_fh); /* ファイルを閉じる */
if(ferr == 0){
printf("ファイルクローズエラー(i)\n");
return(-1);
}
}
return(0);
}
#endif /* WIN32 */ |
最終更新時間:2008年11月17日 20時20分00秒 指摘や意見などあればSandBoxのBBSへ。