【VC++】fopen_sによるファイルの書き込み、読み込み、追記

0

    <機能>
    (1)fopen_sを使用したファイルの入出力のサンプルです
    (2)書き込み"w"、追記"a"、読み込み"r"を行うサンプルです
    (3)fwriteでテキストファイルに書き込みます
    (4)freadでテキストファイルからデータを一気に読み込みます
    (5)fgetsでテキストファイルから行単位で読み込みます

    <動作検証&開発環境>
    Visuao Studio Community 2015

    <イメージ>
    ファイル書き込み、追記した結果(改行は0x0D0A)
    ※サクラエディター使用
    書き込み、追記結果、VC、fopen_s、fwrite、fread、fgets
    ファイルを読み込んだ結果
    読み込み結果、VC、fopen_s、fwrite、fread、fgets

    <使い方>
    (1)Win32コンソールアプリケーションでプロジェクトを作成
    (2)アプリケーション設定画面の共通ヘッダーファイルを追加「MFC」にチェック
    (3)構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を指定
    マルチバイト文字セットを使用する、VC、fopen_s、fwrite、fread、fgets
    (4)ソースの追加

     

    //インクルード

    #include <stdio.h>

     

    ~~中略(main関数)~~

     

    const int MAX_LEN = 2048;

    FILE *fp;

    errno_t err_no;

    int iret,i;

    CString csPath = "tmp.txt";

    CString csErr;

    int numclosed;

     

    //fopen_sによるファイル入出力

    //https://msdn.microsoft.com/ja-jp/library/z5hh6ee9.aspx

    //読込モード:r ファイルが存在しない時はエラー

    //書込モード:w ファイルが既にオープンされているときはエラー

    //追記モード:a ファイルが存在しない時は新規作成、すでにオープンされているときはエラー

     

    //書き込みデータを定義

    //書き込みをバイナリモード(wb)で行う場合は改行をcrlf(¥r¥n)とします

    const char irohauta[8][MAX_LEN] = {

        { "いろはにほへと ちりぬるを¥n" },

        { "わかよたれそ つねならむ¥n" },

        { "うゐのおくやま けふこえて¥n" },

        { "あさきゆめみし ゑひもせす¥n" },

        { "色はにほへど 散りぬるを¥n" },

        { "我が世たれぞ 常ならむ¥n" },

        { "有為の奥山  今日越えて¥n" },

        { "浅き夢見じ  酔ひもせず¥n" }

    };

     

    //(1)テキストモードでファイル書き込み

    //テキスト書き込みモードでファイルをオープン

    err_no = fopen_s(&fp, csPath, "wt");

    if (err_no != 0) {

        csErr.Format("ファイルオープン(書き込みモード)に失敗しました。¥n%s",csPath);

        AfxMessageBox(csErr, MB_ICONSTOP);

        return (-1);

    }

    //ファイルに書き込み

    for (i = 0; i < 4; i++)

    {

        //fwrite(buffer,size,count,stream)

        //buffer : 書き込むデータへのポインター

        //size   : 書き込むサイズ(バイト単位)

        //count  : 書き込み回数

        //stream : FILE構造体へのポインター

        //戻り値 : エラーが発生した場合はcount(書き込み回数)未満

        if ((iret = fwrite(irohauta[i], strlen(irohauta[i]), 1, fp)) == 0) {

            csErr.Format("ファイル書き込み中にエラーが発生しました。¥n%s",csPath);

            AfxMessageBox(csErr,MB_ICONSTOP);

            fclose(fp);

            return (-1);

        }

        

        //fputsを使用しても同様の書き込みができます

        //iret = fputs(irohauta[i], fp);

    }

    //開いているファイルをすべて閉じます(本サンプルでは1ファイル)

    //戻り値(numclosed)は閉じたファイルの数です

    numclosed = _fcloseall();

     

    //(2)テキストモードでファイル追記

    //テキスト追記モードでファイルをオープン

    err_no = fopen_s(&fp, csPath, "at");

    if (err_no != 0) {

        csErr.Format("ファイルオープン(追記モード)に失敗しました。¥n%s", csPath);

        AfxMessageBox(csErr, MB_ICONSTOP);

        return (-1);

    }

    //ファイルに書き込み(追記)

    for (i = 4; i < 8; i++)

    {

        if ((iret = fwrite(irohauta[i], strlen(irohauta[i]), 1, fp)) == 0) {

            csErr.Format("ファイル書き込み中(追記中)にエラーが発生しました。¥n%s", csPath);

            AfxMessageBox(csErr, MB_ICONSTOP);

            fclose(fp);

            return (-1);

        }

    }

    //開いているファイルを閉じます

    numclosed = _fcloseall();

     

    //(3)ファイル読み込み

    //読み込みモードでファイルをオープン

    char buf[MAX_LEN];

    CString cbuf,cwk;


    //改行がcrlf(0x0D0A)のファイルを読み込む際は

    //そのまま読み込んでくれる"rb"が個人的に好みです("r"だと0x0Dが除かれます)

    err_no = fopen_s(&fp, csPath, "rb");

    if (err_no != 0) {

        csErr.Format("ファイルオープン(読み込みモード)に失敗しました。¥n%s", csPath);

        AfxMessageBox(csErr, MB_ICONSTOP);

        return (-1);

    }

    //ファイル全体を一気に読み込むときはfreadが便利です

    //bufにはファイル全体を読み込む十分なサイズが必要です

    TRACE("¥n◎freadでの読み込み結果¥n");

    while (!feof(fp)) {

        ZeroMemory(&buf, MAX_LEN);

        if ( (iret = fread(&buf, 1, sizeof(buf), fp)) == 0 ) break;

     

        //読み込みバッファを表示

        TRACE("%s",buf);

    }

     

    //ファイルの先頭にポインタを移動

    fseek(fp, 0L, SEEK_SET);

     

    //行単位でテキストファイルを読み込む時はfgetsが便利です

    //bufには1行を読み込む十分なサイズが必要です

    TRACE("¥n◎fgetsでの読み込み結果¥n");

    ZeroMemory(&buf, MAX_LEN);

    while (fgets(buf, sizeof(buf), fp) != NULL) {

        //読み込みバッファを表示

        TRACE("%s", buf);

        ZeroMemory(&buf, MAX_LEN);

    }

     

    //開いているファイルを閉じます

    numclosed = _fcloseall();

     

    ~~省略~~

     

    よろしければポチッと押してください

    プログラマー ブログランキングへ

     



    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    << November 2017 >>

    profile

    others

    mobile

    qrcode