c++ - 将数据插入文件中的特定位置而不覆盖c++

标签 c++ file-io

我有一个以二进制格式存储整数的文件。我正在用 C++ 编写一个函数,它获取 int 数据并将其插入到文件中的特定位置。

void AddData(int position, int data);
  • position 是必须插入数据的索引。
  • data是要插入的int值。

代码

void AddData(int position, int data)
{

    fstream os;        
    char buff[4096];
    cnt1 = position;
    cnt2+=(data_cnt-cnt1); // data_cnt is global var to cout the no. of data items 

    os.open("edata.dat", ios::out | ios::in | ios::binary );

    os.seekg(0);                    // start from beg
    os.seekg(cnt1*sizeof(int));     // move to position at which data has to be inserted
    os.read(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); // read rest of file 
    os.seekg(cnt1*sizeof(int));     // move back to previous position
    cout << os.tellg();
    os.write( reinterpret_cast<char*>(&data), sizeof(int) ); //add data
    os.write(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); //write back the read data
    data_cnt++;
}

第一次调用函数时,显示添加了两次数据项。当函数被第二次调用时,tellg() 显示 -1。

想不通,怎么了?

最佳答案

老实说,我也看不出有什么问题,但是 - 请原谅我这么直截了当 - 你的编码风格没有帮助!!

在我看来,在你的例子中有很多地方是错误的:

  1. 你使用一个全局变量来计算项目的数量。
  2. 您假设剩余部分不会超过 4096 字节
  3. 你的 reinterpret_cast 完全没有必要(写 'buff' 和写 '&buff[0]' 一样,直接给你一个 char*)
  4. 你不做任何检查(例如位置超出文件末尾 ?)

老实说,即使你让这段代码工作,每个维护它的人都会非常讨厌你。 (我很抱歉听起来很刻薄,但我过去不得不维护大量这样的代码,如果因为你切换到 64 位操作系统,某个地方突然不起作用,那将是一场噩梦;))

足够的讲授,有时间提出建议:

为什么不简单地执行以下操作:

  • 将源文件从开头到“位置”(检查位置在文件的边界内!)复制到一个临时文件。
  • 将你的整数写入你的临时文件
  • 将源文件(从位置+1到eof)复制到临时文件(从位置+2)
  • 删除edata.dat,将temp重命名为edata.dat

它更容易、更安全、更清洁,而且可能同样快速。最重要的是:如果在结束之前发生错误,您的 edata.dat 仍然处于稳定、未损坏的状态。

希望对你有帮助

关于c++ - 将数据插入文件中的特定位置而不覆盖c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11813724/

相关文章:

C++。避免多个文件项目中的交叉链接

c++ - 如何使用转到文件的第 m 行和第 n 个字符?

java - 从 Java 小程序访问输入类型 ="file"完整路径

java - 使用 Java 上传文件(带进度条)

C++从文件的一部分加载数据

php - 删除使用 PHP 生成的 CSV 文件开头不需要的空间

c++ - 在不关闭套接字的情况下使用 Boost::ASIO 连续传输数据

具有空派生类对象的 C++ 继承大小

c++ - 什么时候 boost::shared_ptr 可能不会被释放?

java - 通过 Java 将文本插入现有文件