Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改二进制文件_C++_Windows_File_Binary - Fatal编程技术网

C++ 更改二进制文件

C++ 更改二进制文件,c++,windows,file,binary,C++,Windows,File,Binary,我在windows上有一个文件。我在用C++编写。我有一个问题,需要从文件末尾删除一些字节。我正在使用ifstream,但我不知道如何删除这些字符,简单地将“\0”放在文件中还是什么?为什么不截断文件?查看chsize()方法。为什么不截断文件?查看chsize()方法。在linux机器上,使用truncate(): 在Windows计算机上,使用SetEndOfFile(): 两者都是依赖于操作系统的调用。在linux机器上,使用truncate() 在Windows计算机上,使用Set

我在windows上有一个文件。我在用C++编写。我有一个问题,需要从文件末尾删除一些字节。我正在使用ifstream,但我不知道如何删除这些字符,简单地将“\0”放在文件中还是什么?

为什么不截断文件?查看
chsize()
方法。

为什么不截断文件?查看
chsize()
方法。

在linux机器上,使用truncate():

在Windows计算机上,使用SetEndOfFile():


两者都是依赖于操作系统的调用。

在linux机器上,使用truncate()

在Windows计算机上,使用SetEndOfFile():


这两种调用都依赖于操作系统。

您无法通过便携方式更改文件的大小;唯一的方法是将文件复制到临时文件,然后删除原始文件并重命名临时文件


如果只是截断文件,那么Windows和Unix(但不一定是其他系统)都有系统级的函数可以实现这一点,但标准中没有支持它的函数。如果你最终不得不删除除末尾以外的字节,Windows和Unix都不允许这样做(尽管其他一些系统允许这样做,至少在特定情况下是这样)。

你不能以可移植的方式更改文件的大小;唯一的方法是将文件复制到临时文件,然后删除原始文件并重命名临时文件



如果只是截断文件,那么Windows和Unix(但不一定是其他系统)都有系统级的函数可以实现这一点,但标准中没有支持它的函数。如果你最终不得不删除字节而不是在最后,Windows和Unix都不允许这样做(尽管其他一些系统允许,至少在特定情况下是这样)。

我在Ifstreams的API中没有看到它。它不是iostreams的一部分,它是一个单独的方法,你可以通过文件调用它,它将调整文件的大小(因此,使用chsize for windows删除尾随字节-这可能是您想要的?)。如果我再次打开它并转到EOF,它将是新的大小?我在IFSTREAMS的API中没有看到它。它不是iostreams的一部分,它是一个单独的方法,您可以通过文件调用它-它将调整文件大小(并因此删除尾随字节-这大概是您想要的?)使用chsize for windows。如果我再次打开它并转到EOF,它将是新的大小?使用SetEndOfFile for windows。我需要使用seek到达我想要结束的地方,然后使用该方法?如果我再次打开它并转到EOF,它将是新的大小?更新…请参阅链接。上面写着,您需要搜索到您想要的位置
EOF
to be。使用SetEndOfFile for windows。我需要使用seek到达我想要结束的地方,然后我使用该方法?如果我再次打开它并转到EOF,它将是新的大小?更新…请参阅链接。上面写着,你需要搜索到你想要的
EOF
所在的地方。我只需要在结束和结束时进行搜索不在中间或开始。我的问题是,如果我在Windows中使用它,OS的所有其他内部参数都会被更新吗?如果你愿意使用Boost,1.46支持<代码> Resiz()。现在应该允许一定程度的可移植性的方法-为什么从一开始就不包括它是一个谜…@Roman如果使用依赖于系统的函数,它将执行系统指定的操作。如果系统规范说它截断了文件,那么它会截断文件(或者系统中存在错误)没有标准支持截断文件吗?哇!这是一个惊人的疏忽。戴维,这取决于你的观点。C和C++被设计成在所有平台上都是可实现的,而且有一些不支持文件截断的平台。(早期UNIX没有,这就是C最初开发的)。我只需要做它的结束,而不是在中间或开始。我的问题是,如果我在Windows中使用它,OS的所有其他内部参数将被更新的变化吗?如果你愿意使用Boost,1.46支持一个<代码> Resiz()现在应该允许一定程度的可移植性的方法-为什么从一开始就不包括它是一个谜…@Roman如果使用依赖于系统的函数,它将执行系统指定的操作。如果系统规范说它截断了文件,那么它会截断文件(或者系统中存在错误)没有标准支持截断文件吗?哇!这是一个惊人的疏忽。戴维,这取决于你的观点。C和C++被设计成在所有平台上都是可实现的,而且有一些不支持文件截断的平台。(早期UNIX没有,这就是C最初开发的)。