これも、別にたいした話ではないのだけど、
あくまでも、自分へのメモとして。
VC++での、ファイルの一気読み
/*==============================================*/ /* メソッド名:readTextdataFile */ /* 内容:ファイルを読み込む(テキスト用) */ /* 注意:返り値は、呼び出し側で解放してね */ /* 引数: fname 読み込みファイル */ /* 返り値:null エラー */ /* その他 読み込み内容 */ /*==============================================*/ unsigned char *MyUtil::readTextdataFile(char *fname) { FILE* fp; unsigned char* data; long datasize; // ファイルポインタの取得 if ( (fp = fopen(fname, "rb")) == NULL ) { return NULL; } //ファイルの大きさセット fseek(fp, 0, SEEK_END); datasize = ftell(fp); // 領域確保 data = (unsigned char*)malloc(datasize+1); if ( data == NULL ) { return NULL; } // 読み込みます fseek(fp, 0, SEEK_SET); fread(data, 1, datasize, fp); fclose(fp); // 最後に0(NULL)をいれとく // バイナリだと、こまっちゃうけど。 // なので、テキスト用 data[datasize] = 0; return data; } |
最後に0を入れているので、バイナリ用ではなく、
テキスト用(まあ、途中、ファイルサイズも取得するので、
それを返すようにすれば、バイナリ用にはなるけど)
引数がファイル名で、返り値が読み込み結果なので、
呼び出し先で、エリアはフリーすることになる。
ftellを使っているので、よくないかも。。
(20日追加)
一方、一気書きは、こんなかんじ
if ( (fp = fopen((const char*)fname,"wb")) == NULL ) { return -1; } fwrite(buf,bufsize,1,fp); fclose(fp); |
ただし前提として
・fnameにファイル名が入っていて、
・bufが読み込み領域、
・bufsize分読み込むとする
・bufとfnameの領域は、すでに確保されていて、読み込み後、解放するとする。