VisualStudio 2005 Standardで、VC++を利用しています。
std::fstreamでのファイル読み出しなのですが、ロケールの設定を行わないと、readに失敗してしまう状況に遭遇しました。VC6では問題がなく、VC7.1でも問題は起きていなかったかと思います。
以下は、setting.datというファイルをプログラムと同じ場所に置いてその中のデータを読み取るプログラムです。デバッガーでbuff2変数を見てみると、ロケールを設定していない場合file.readの実行を行ってもbuff2の内容が変化しませんが、ロケールを設定していた場合fread後と同じようにbuff2の内容が変化します。
#include <fstream>
#include <Windows.h>
#include <conio.h>
inline bool IsFileExist(const char* path)
{
WIN32_FIND_DATAA findData;
HANDLE hResult = ::FindFirstFileA(path, &findData);
bool ret = hResult != INVALID_HANDLE_VALUE;
::FindClose(hResult);
return ret;
}
int main(int argc, char* argv[])
{
if (1 || argc > 1) {
std::locale::global(std::locale("japanese"));
// _tsetlocale(LC_ALL, _T("jpn"));
puts("set locale japanese.\n");
puts("\n");
}
char drive [_MAX_DRIVE+1] = {0};
char dir [_MAX_DIR+1] = {0};
char fname [_MAX_FNAME+1] = {0};
char ext [_MAX_EXT+1] = {0};
char resultPath [_MAX_PATH+1] = {0};
_splitpath(argv[0], drive,dir,fname,ext);
_makepath(resultPath, drive,dir,"setting.dat", NULL);
puts(resultPath);
char buff2[1024] = {0};
FILE* fp = fopen(resultPath, "rb");
size_t readBytes = fread(buff2, 1, 1024, fp);
fclose(fp);
try {
if (IsFileExist(resultPath)) {
std::fstream file;
file.open(resultPath, std::ios_base::in | std::ios_base::binary);
memset(buff2, 0, 1024);
file.read(buff2, 1024);
int cnt = file.gcount();
}
}catch (const std::exception& exp) {
puts(exp.what());
}
_getch();
return 0;
}