【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>

     

    // 唯一のアプリケーション オブジェクトです
    CWinApp theApp;

    using namespace std;

    int main()
    {
        int nRetCode = 0;

        HMODULE hModule = ::GetModuleHandle(nullptr);

        if (hModule != nullptr)
        {
            // MFC を初期化して、エラーの場合は結果を印刷します。
            if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
            {
                //〜〜中略〜〜
            }
            else
            {
                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();
            }
        }
        else
        {
            //〜〜中略〜〜
        }

        return nRetCode;
    }

     

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

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

     



    selected entries

    categories

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
    << November 2018 >>

    profile

    others

    archives