Ofstream写入太多字节

Ofstream writing too many bytes

本文关键字:多字节 太多 Ofstream      更新时间:2023-10-16

我想在文件中写入时遇到了一些麻烦。这个程序的主要目的是从一个exe文件中读取所有数据,然后在另一个exe文件中写入数据。问题是当我写新文件时,它写了太多的代码。例如,我读取45568 (n=45568)字节,但在新文件中,我有45800字节,我不明白为什么。

#include <fstream>
#include <iostream>
int main(int argc, char** argv)
{
    using namespace std;
    ifstream file;
    file.open("a.exe", istream::in | ios::binary);
    std::streampos fsize = 0;
    fsize = file.tellg();
    file.seekg(0, std::ios::end);
    fsize = file.tellg() - fsize;
    file.close();
    int n = fsize;
    file.open("a.exe", istream::in | ios::binary);
    std::cout << n << " " << endl;
    int z=0;
    char *p = new  char[n+1];
    for (int i = 0;i < n;i++)
    {
        char ch;
        file.get(ch);
        p[i] = ch;
    }
    file.close();
    ofstream g;
    g.open("b.bin");
    std::cout << n;
    g.write(p, n);
    return 0;
}

改变这一行:

g.open("b.bin");

是这样的:

g.open("b.bin", istream::out | ios::binary);

在Windows(以及遗留的DOS和许多其他遗留环境)上,以文本模式打开的文件对于行尾char: n得到特殊处理。当Windows写入文本模式文件时,所有的n字符都以rn的形式写入文件。类似地,文本模式下的文件读取将rn序列转换为n。以二进制模式打开文件会关闭所有这些转换行为。

同时,整个程序可以简化为:

void main(int argc, char** argv)
{
    ifstream in;
    ofstream out;
    in.open("a.exe", istream::in | ios::binary);
    out.open("b.bin", istream::out | ios::binary);
    while (in.rdstate() == in.goodbit)
    {
        char c;
        if (in.get(c))
        {
            out.write(&c, 1);
        }
    }
}