gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:14 25 4
gpt4 key购买 nike

我有一个以二进制格式存储整数的文件。我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com