关于c++中fstream的几个问题

several questions about fstream in c++

本文关键字:几个问题 fstream c++ 关于      更新时间:2023-10-16

首先,我对处理大文件的最佳方式感兴趣,下面的代码是推荐的方式吗?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
    ifstream file("first.exe", ios::binary | ios::app);
    file.seekg(0, ios::end);
    int size = file.tellg();
    file.seekg(0, ios::beg);
    char content[size];
    file.read(content, size);
    ofstream file2("second.exe", ios::binary);
    file2.write(content, size);
    file2.close();
}

还有,为什么在这种情况下需要使用二进制模式?

这是推荐的方法吗?不是真的。见下文.

二进制模式?

有两种打开文件的方式:文本模式和二进制模式。默认为文本模式,除非您在打开文件时使用std::ios::binary

在Linux/Unix上二进制模式和文本模式是相同的。这没什么区别。

在Windows上,当文件以文本模式打开时,o/s会进行一些转换。当你写一个n (ASCII 10),它被转换成一个rn对(ASCII 10和13)。当你读取一个rn对时,它被转换成一个n。另外,Ctl-Z (ASCII 26)被视为文件结束,因此读取将终止。

这是历史原因,我现在不会详细说明。如果您读取和写入纯ASCII文本,这不会引起任何问题,甚至可能是可取的。如果您正在处理其他任何文件(例如exe文件),则必须使用二进制模式。

下面的代码演示了一种简单的文件i/o技术,它试图捕捉c++编程的本质。我希望这是不言自明的。查找std::copy(), std::istreambuf_iterator和std::ostreambuf_iterator的引用,并在需要时提出问题。

#include <iostream>
#include <fstream>
#include <algorithm>
int main() 
{
    std::ifstream fsIn("first.exe", std::ios::binary);
    std::ofstream fsOut("second.exe", std::ios::binary|std::ios::trunc);
    std::copy(std::istreambuf_iterator<char>(fsIn), 
              std::istreambuf_iterator<char>(), 
              std::ostreambuf_iterator<char>(fsOut));
    return 0;
}