none
VS2008,fstreamとCファイルストリームの違いについて RRS feed

  • 質問

  • こん○○は。

    VC++で遊んでいて、解らないところができたので、質問をします。

     

    【やりたいこと】

    windowsのマイドキュメントディレクトリの中のファイルを読みたい。

     

    【やったこと】

    以下に実験したソースを書きます。

    1.fstreamを利用した読み込み

    int main(){

     std:Tongue Tiedtring file_name = "C:\\Documents and Settings\\***\\My Documents\\data.txt";
     std::vector<std:Tongue Tiedtring> data;
     std:Tongue Tiedtring temp;
     std::vector<std:Tongue Tiedtring>::iterator i;
     const int BUFSIZE = 1024;
     char* buffer[BUFSIZE];

     

     std::fstream fin(file_name.c_str(),std::ios::in);
     if(fin == NULL){
      std::cout << "ファイルが開けません" << std::endl;
      return -1;
     }

     for (fin.getline((char*)buffer, BUFSIZE); !fin.fail(); fin.getline((char*)buffer, BUFSIZE)){
      temp = (char*)buffer;
      data.push_back(temp);
     }
     fin.close();
     for( i = data.begin();i != data.end();i++)
      std::cout << i->c_str()  << std::endl;

     return 0;

    }

     

    2.FILE*を利用した読み込み

    int main(){

     std:Tongue Tiedtring file_name = "C:\\Documents and Settings\\***\\My Documents\\data.txt";
     std:Tongue Tiedtring temp;
     std::vector<std:Tongue Tiedtring>::iterator i;
     const int BUFSIZE = 1024;
     char* buffer[BUFSIZE];

     

     FILE* fp = fopen(file_name.c_str(),"r");
     if(fp == NULL)
     {
      std::cout << "ファイルが開けません" << std::endl;
      return -1;
     }
     while (fgets ((char*)buffer, BUFSIZE, fp) != NULL)
     {
      temp = (char*)buffer;
      data.push_back( temp );
     }
     fclose(fp);
     for( i = data.begin();i != data.end();i++)
      std::cout << i->c_str()  << std::endl;
     return 0;

    }

     

    【結果】

    (1)1.のfstreamを利用したコードでは、ファイルの読み込みは失敗しました。

    (2)2.のFILE*を利用したコードでは読み込みに成功しました。

    (3)マイドキュメント以外のファイル、(例えばC:\tempなど)マイドキュメント以外のディレクトリ内ファイルはどちらも

    正常に読める。

     

    【解らないこと】

    fstreamもFILEも同じファイルを読み込むはずなのに、差が出る理由がマイドキュメント内のファイルを

    読み込むためだと言う事以外想像できません。

    何故違いがでるのか、単なるちょんぼなのか、ご教示頂きたくお願いします。

     

    2008年3月31日 15:49

回答

すべての返信