1

私のプロジェクトでは、バイナリファイルの読み取りと書き込みが必要です。基本的には、リンクリストをファイルにシリアル化します。ここで、値をバイナリ形式で保存し、tellp()/ tellg()オフセットを覚えていますが、できません。それ。これにより、その中のすべてのコンテンツがゼロに消去され、挿入する代わりに現在のコンテンツが押し戻されます。

たとえば、次のプログラムでは、ファイルを開き、1,120,323などの値を書き込みます。それからそれを閉じてそれを読んでください、それは正確な正しい値1,120,323を示しています。しかし、120-> 220の値を置き換えようとすると、1はゼロになり、値は0 220 220として読み取られます。基本的に220は上書きし、323をプッシュバックします。

#include <iostream>
#include <fstream>
#include <cstdlib>

int main() {
  std::cout<<"File Ofstream Testing "<<std::endl;   

  const char * file_name = "Test_File.bin";
  int ONE = 1;
  int ZERO = 0;

  int ONE_TWENTY = 120;
  int TWO_TWENTY = 220;

  int THREE_TWENTY_THREE = 323;
  int THREE_FORTY_FIVE = 345;

//---------------------------------------------------------------------------
{
 std::ofstream file_write(file_name, std::ios::out|std::ios::binary);

 if(!(file_write.is_open())) {
    std::cout<<"File cannot be opened "<<std::endl;
    exit(0);
 }

 file_write.seekp(0);
 file_write.write((char *)&ONE,sizeof(int));
 file_write.write((char *)&ONE_TWENTY,sizeof(int));
 file_write.write((char *)&THREE_TWENTY_THREE,sizeof(int));

 file_write.close();
}
//---------------------------------------------------------------------------
{
 std::ifstream file_read(file_name,std::ios::in|std::ios::binary);

 if(!(file_read.is_open())) {
        std::cout<<"File cannot be opened "<<std::endl;
        exit(0);
 }

 int temp;
 file_read.seekg(0);
 file_read.read((char *)&temp,sizeof(int));
 std::cout<<"Temp "<<temp<<std::endl;
 file_read.read((char *)&temp,sizeof(int));
 std::cout<<"Temp "<<temp<<std::endl;
 file_read.read((char *)&temp,sizeof(int));
 std::cout<<"Temp "<<temp<<std::endl;

 file_read.close();
}
  //---------------------------------------------------------------------------
{
  std::ofstream file_write(file_name, std::ios::out|std::ios::binary);

  if(!(file_write.is_open())) {
   std::cout<<"File cannot be opened "<<std::endl;
   exit(0);
 }

 file_write.seekp(sizeof(int));
 file_write.write((char *)&TWO_TWENTY,sizeof(int));
 file_write.seekp(sizeof(int) + sizeof(int));
 file_write.write((char *)&THREE_FORTY_FIVE,sizeof(int));

 file_write.close();
}
//--------------------------------------------------------------------------
{
  std::ifstream file_read(file_name,std::ios::in|std::ios::binary);

  if(!(file_read.is_open())) {
    std::cout<<"File cannot be opened "<<std::endl;
    exit(0);
}

  int temp;
  file_read.seekg(0);
  file_read.read((char *)&temp,sizeof(int));
  std::cout<<"Temp "<<temp<<std::endl;
  file_read.seekg(sizeof(int));
  file_read.read((char *)&temp,sizeof(int));
  std::cout<<"Temp "<<temp<<std::endl;
  file_read.seekg(sizeof(int) + sizeof(int));
  file_read.read((char *)&temp,sizeof(int));
  std::cout<<"Temp "<<temp<<std::endl;

   file_read.close();
 }
 //--------------------------------------------------------------------------------
 return 0;
}//fn:main
4

1 に答える 1

1

出力ストリームの場合、で開くことstd::ios::outはと同等std::ios::out | std::ios::truncであるため、2回目に宣言するstd::ofstream file_writeと、以前に書き込まれたコンテンツは破棄され、ファイルを新たに書き込んでいます。その後file_write.seekp(sizeof(int));、空のストリームで実行すると、ゼロバイトが書き込まれます。に追加する必要がある場合ofstreamは、で開きますstd::ios:app。それはファイルを切り捨てませんが、一方であなたがそれに追加することを可能にするだけです。

ファイルストリームに対してランダムアクセス書き込みを行う場合は、それをとして宣言しfstream、読み取りモードと書き込みモードの両方で開く必要があります。したがって、必要なのは次のとおりです。

std::fstream file_write(file_name, std::ios::in | std::ios::out | std::ios::binary);

于 2012-04-10T22:04:07.883 に答える