【VC++】fopen_sによるファイルの書き込み、読み込み、追記
<機能>
(1)fopen_sを使用したファイルの入出力のサンプルです
(2)書き込み"w"、追記"a"、読み込み"r"を行うサンプルです
(3)fwriteでテキストファイルに書き込みます
(4)freadでテキストファイルからデータを一気に読み込みます
(5)fgetsでテキストファイルから行単位で読み込みます
<動作検証&開発環境>
Visuao Studio Community 2015
<イメージ>
ファイル書き込み、追記した結果(改行は0x0D0A)
※サクラエディター使用
ファイルを読み込んだ結果
<使い方>
(1)Win32コンソールアプリケーションでプロジェクトを作成
(2)アプリケーション設定画面の共通ヘッダーファイルを追加「MFC」にチェック
(3)構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を指定
(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;
}
よろしければポチッと押してください