ファイル操作のひな型

ファイルを読み込んで何か処理するときに必ず行う処理を投稿。

・ドロップファイルのパスを取得
・ドロップファイル名の後ろにおまけをつけて出力ファイルを作成

```cpp
#include <Windows.h>
#include <string.h>
#include <stdio.h>
#include "stdlib.h"

#include <iostream>
#include <fstream>

//#define DEBUG_OUT
//#define EXEPATH
//#define F5DEBUG

int main(int argc,char* argv[]) 
{
#ifdef F5DEBUG
	//F5で実行するとargcが4。exeにファイルドロップすると2なので、F5実行の時のみ行うdebug処理を書く。
	//（VC設定でdebugフォルダのaaa.txtを引数で渡しているが、スペースが挟まるとargv[2]～[4]に分割して格納されてしまう為）
	if(2!=argc)
	{
		printf("\nデバッグON\n");
		char* debug_path;
		debug_path = new char[1000];
		memset(debug_path,NULL,sizeof(debug_path));
		strcat(debug_path,argv[1]);
		strcat(debug_path," ");
		strcat(debug_path,argv[2]);
		strcat(debug_path," ");
		strcat(debug_path,argv[3]);
		strcpy(argv[1],debug_path);
		delete debug_path;
	}
#endif

	//ファイルオープンして読み込む
	FILE *readFp = NULL; 

	//ドロップファイルのファイルパス用
	//char path[_MAX_PATH];		/* _MAX_PATH260 */
	char drive[_MAX_DRIVE];		/* _MAX_DRIVE 3 */
	char dir[_MAX_DIR];			/* _MAX_DIR256 */
	char FileName[_MAX_FNAME];	/* _MAX_FNAME256 */
	char ext[_MAX_EXT];			/* _MAX_EXT256 */
	//memset(path,     NULL,sizeof(path));
	memset(drive,    NULL,sizeof(drive));
	memset(dir,      NULL,sizeof(dir));
	memset(FileName, NULL,sizeof(FileName));
	memset(ext,      NULL,sizeof(ext));
	
	if(argc <= 1)
	{
		printf( "%s\n\nファイルをドロップしてください。" );
		getchar();//結果見せるため止める
		return -1;
	}
	

	//出力ファイル
	FILE* All_outfp;
	char pathAndName[1000];
	memset(pathAndName,NULL,sizeof(pathAndName));

	fpos_t fsize  = 0;		//ファイルサイズ取得用
	fpos_t fsizeb = 0;
	byte* readBuff = NULL;	//ファイルをここに丸ごと読み込んで処理する。もしかしたらfpを使えば不要かもしれないが、読み込んでおけば早いというメリットもありそう。

	for(int FinFileNum = 1; FinFileNum < argc; FinFileNum++)
	{

		//初期化
		All_outfp = NULL;
		memset(pathAndName, NULL, sizeof(pathAndName));
		fsize  = 0;
		fsizeb = 0;
		
		fopen_s(&readFp, argv[FinFileNum], "rb");
		printf("argc = %d FinFileNum = %d\n%s を受け取った\n", argc, FinFileNum, argv[FinFileNum]);
		if(readFp == NULL)
		{
			//例外
			printf( "%s\nがドロップされたが、なぜかファイルオープン失敗！フォルダ？\n", argv[FinFileNum] );
			getchar();//結果見せるため止める
			return -1;
		}

		//ドロップされたファイル名取得
		_splitpath_s(argv[FinFileNum], drive, sizeof(drive), dir, sizeof(dir), FileName, sizeof(FileName), ext, sizeof(ext));

		strcat_s( pathAndName, _countof(pathAndName), drive);
		strcat_s( pathAndName, _countof(pathAndName), dir);
		strcat_s( pathAndName, _countof(pathAndName), "\\");

		strcat_s( pathAndName, _countof(pathAndName), FileName);
		strcat_s( pathAndName, _countof(pathAndName), ext);
		strcat_s( pathAndName, _countof(pathAndName), "_out.txt");
        // ドロップされたファイルの末端におまけをつけて出力ファイルとする
		fopen_s( &All_outfp, pathAndName, "w" );

		if( All_outfp == NULL )
		{
			printf( "出力用ファイル「%s」が開けない。開いてる?\n",pathAndName );
			getchar();//結果見せるため止める
			return -1;
		}

		//
		//ファイル読む
		//
		fsizeb =  fseek(readFp,0,SEEK_END);
		fgetpos(readFp,&fsize);
		fseek(readFp,fsizeb,SEEK_SET);
		//fsize++;	//文字データとして読み込むときにNULLが必要だったからつけた気がする

		readBuff = (byte *)malloc( fsize );
		memset(readBuff,NULL,fsize);
		fread( readBuff, 1, fsize, readFp );

        /*
        読む時にこんなふうにすると構造体にはめて読める。(hogeは構造体として定義しておく)
		memset(&hoge, NULL,   sizeof(hoge));
		memcpy(&hoge, readBuff,sizeof(hoge));
        */
		/*
        出力ファイルにはこんな感じでデータかける。(文字出力)
		fprintf( All_outfp,  "fugafuga\n");
		fclose( All_outfp );
        */

		//メモリ開放
		free(readBuff);
		readBuff = NULL;
	}

	printf( "%dファイル処理終了\n" );
	::Sleep(3000);
}

```