トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

ScrapCode/C/FileIOFunc

INDEX

C言語のIO関数

C言語の低水準・高水準 および Win32API を使用したファイルの読み書き処理。

サンプルとしてコピー元とコピー先のファイル名を与えてそれぞれの関数を利用して内容をコピーを作成する関数。手元に残っていたのをそのまま転記。

低水準ファイル処理

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
/* **************************************************************** */
/* *    インクルードファイル定義                                  * */
/* **************************************************************** */
#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
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
54
55
/* **************************************************************** */
/* *    インクルードファイル定義                                  * */
/* **************************************************************** */
#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
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
54
55
56
57
58
59
60
61
62
63
/* **************************************************************** */
/* *    インクルードファイル定義                                  * */
/* **************************************************************** */
#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へ。