C++ 在文件开头添加文本和行(C+;+;)

C++ 在文件开头添加文本和行(C+;+;),c++,cross-platform,C++,Cross Platform,我希望能够在文件的开头添加行 我正在编写的这个程序将从用户那里获取信息,并准备将其写入文件。那么,该文件将是一个已经生成的diff,并且添加到开头的是描述符和标记,使其与Debian的DEP3补丁标记系统兼容 这需要跨平台,所以它需要在GNU C++(Linux)和微软C++(以及MAC所附带的任何东西)中工作。 (其他相关线程:)请参阅答案: 不能在磁盘上文件的开头插入数据。您需要将整个文件读入内存,在开头插入数据,然后将整个文件写回磁盘。(这不是唯一的方法,但考虑到文件不太大,这可能是最好的

我希望能够在文件的开头添加行

我正在编写的这个程序将从用户那里获取信息,并准备将其写入文件。那么,该文件将是一个已经生成的diff,并且添加到开头的是描述符和标记,使其与Debian的DEP3补丁标记系统兼容

<>这需要跨平台,所以它需要在GNU C++(Linux)和微软C++(以及MAC所附带的任何东西)

中工作。 (其他相关线程:)

请参阅答案:

不能在磁盘上文件的开头插入数据。您需要将整个文件读入内存,在开头插入数据,然后将整个文件写回磁盘。(这不是唯一的方法,但考虑到文件不太大,这可能是最好的方法。)

可以通过对输入文件和输出文件使用来实现这一点。之后,您可以使用和替换旧文件:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>

int main(){
    std::ofstream outputFile("outputFileName");
    std::ifstream inputFile("inputFileName");

    outputFile << "Write your lines...\n";
    outputFile << "just as you would do to std::cout ...\n";

    outputFile << inputFile.rdbuf();

    inputFile.close();
    outputFile.close();

    std::remove("inputFileName");
    std::rename("outputFileName","inputFileName");
    
    return 0;
}

可能的重复看起来确实像重复,但另一个问题没有很好的答案。@JonathanWakely您知道一种更好的跨平台语言吗?用于文本处理?当然,python。@JonathanWakely我也会问如何在python中做到这一点(在另一个问题中),因为我更愿意在linux平台上使用python。我选择C++是因为Linux、MAC和Windows都可以运行C++(不需要维护两个程序)。在Windows中设置python是。。。这个词可能很狡猾。。。为了正确运行
,而在写入另一个文件后,
循环可以替换为
outputFile,他可以
删除
原始文件,并
重命名
具有原始名称的另一个文件。但是,在执行此操作之前,您可能想在
fstream
上调用
close
。与其使用
vector
为什么不直接使用
stringstream
?感谢您的建议,我想这不是我最好的日子:/…(
std::vector
而不是
std::stringstream
?真的吗?该死,我相信我写那篇文章的时候睡着了)。是的,现在看起来好多了:)
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

int main(){
    const std::string fileName = "outputFileName";
    std::fstream processedFile(fileName.c_str());
    std::stringstream fileData;

    fileData << "First line\n";
    fileData << "second line\n";

    fileData << processedFile.rdbuf();
    processedFile.close();

    processedFile.open(fileName.c_str(), std::fstream::out | std::fstream::trunc); 
    processedFile << fileData.rdbuf();

    return 0;
}