none
std::fstream 複数バイト文字が含まれているパス上のファイルへのアクセス

    質問

  • 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;
    }

     

    2006年2月21日 6:08

すべての返信

  • ご報告ありがとうございます。

    問題を確認しました。
    サービスパックもしくは次期バージョンでの対応を検討いたします。

    回避方法といたしましては、ご指摘のようにローケールをセットしていただくか、Unicode 文字列を使用してくださいますようお願いします。

    なお、VS2005 より、#define Unicode が規定値となりましたので、ご承知おきください。

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

     

    2006年2月22日 6:05