C++ 如何在C++;,同时保持文件的其余部分不变

C++ 如何在C++;,同时保持文件的其余部分不变,c++,C++,我想用另一个字节覆盖文件中的一个字节。当我这样做的时候,它会在“在记事本中查看时”用空格替换之前和之后的所有字节 我的问题是如何在不更改文件中其他字节的情况下更改文件中的字节值 谢谢你抽出时间 这是我的密码 #include "math.h" #include <Windows.h> #include <iostream> #include <fstream> #include <string> using namespace std; in

我想用另一个字节覆盖文件中的一个字节。当我这样做的时候,它会在“在记事本中查看时”用空格替换之前和之后的所有字节

我的问题是如何在不更改文件中其他字节的情况下更改文件中的字节值

谢谢你抽出时间

这是我的密码

#include "math.h"
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;



int main()
{
    ofstream fout;
    fout.open("file.bin", ios::binary | ios::out | ios::beg);
    fout.seekp(10);

    int a = 0x21;
    fout.write((char*)&a, sizeof(a));

    fout.close();


    return 0;
}
#包括“math.h”
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
流式流量计;
fout.open(“file.bin”,ios::binary | ios::out | ios::beg);
fout.见第(10)条;
int a=0x21;
fout.write((char*)&a,sizeof(a));
fout.close();
返回0;
}
这将在文件中的第10个位置/地址写入“!”。但是,它不会保留文件中的其他数据(字节)。这些内容在记事本中用空格删除

编辑

胡桃的建议奏效了!我的问题是使用开放标志“ios”和“ios\u base”有什么区别? 谢谢

下面是工作程序。编辑文件并写入“!“同时保留写入字节前后的其他字节值

#include "math.h"
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ofstream fout;
    fout.open("file.bin", ios_base::out | ios_base::in | ios_base::binary);
    fout.seekp(5);

    int a = 0x7B5C;
    fout.write((char*)&a, 2);
    fout.close();

    return 0;
}
#包括“math.h”
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
流式流量计;
fout.open(“file.bin”,ios_base::out | ios_base::in | ios_base::binary);
第四,见第(5)条;
INTA=0x7B5C;
四写((字符*)&a,2);
fout.close();
返回0;
}

您这里的问题是您正在写入一个
int
,而不是一个“字节”。您正在将
sizeof(int)
字节写入文件,而不仅仅是一个。如果您想用不同的字节覆盖文件中的一个字节,那么您必须写入一个字节:


如果您试图在文件中间插入一个或多个字节,从而导致文件变长,则无法执行此操作。您必须执行其他操作,例如编写一个新文件,其中包含旧文件的第一部分、插入的内容,然后是旧文件的其余部分。或者只加载旧文件的其余部分将文件插入内存,将旧文件截断到要插入的位置,然后在旧数据之后追加新数据。尽管后者要求能够将所有文件读入内存。

请解释代码的工作方式。假设我想在文件中间写入一个值。当我使用代码执行此操作时,我会TD在前面的和之后都覆盖了。在标准C++中,你不能。一个常见的技术是创建一个第二个文件,拷贝第一个到第二个内容的任何需要的改变,然后删除原来的,并将新文件移动/重命名为原来的。然而,最合理的能力和现代的操作系统支持。一些(平台特定的)意味着直接去做。原因标准C++不支持这是因为一些真实世界平台(或磁盘格式)不支持。@彼得:“在标准C++中,你不能。“什么时候开始的?IoFror或Frad在哪里阻止您写入文件中间的特定位置?@ NICOLBORAS没有办法在开始或中间插入内容,同时保留现有内容。新内容只能覆盖现有内容,或在结尾追加。我使用的文件大小不会改变。我只想将一个byte/int或文件中的任何内容更改为不同的值。我可以使用一个十六进制编辑器,但我想做它在C++。谢谢@这很容易做到,正如Nicol的例子所示。写入后,在关闭文件之前查找文件的结尾。仍然不起作用#include“math.h”#include#include#include#include使用名称空间std;int main(){ofstream fout;fout.open(“file.bin”,ios::binary | ios::out | ios::beg);fout.seekp(0x0f);fout.put(0x21);fout.close();return 0;}@Cyclone:说它“不工作”是没有用的。你如何确认它不起作用?你在用什么文件?运行代码时,文件发生了什么变化?
fout.seekp(location_to_overwrite);
fout.put(0x21);