不能在写一个文件中的特定位置。 在一个特定的位置写删除所有内容之前和之后移动值(Can'

2019-10-16 14:24发布

在我的项目,有需要读取和写入二进制文件,基本序列化链表在文件中,在这里我以二进制格式存储的值,并记住tellp()/所以tellg()偏移,怎么过,我不能做那。 这将删除所有内容,它为零,而不是插入它使当前的内容了。

例如,在下面的节目,我打开一个文件,写值说1120323。 然后关闭它,阅读它,它显示确切的正确值1120323。 但是当试图替换的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

Answer 1:

对于输出流,用开放std::ios::out相当于std::ios::out | std::ios::trunc std::ios::out | std::ios::trunc ,所以当你声明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);



文章来源: Can't Over write on a specific location on a file. Over write on a specific location deletes all the contents before it and moves the value after it