在不丢失文件内容的情况下写入文件中的特定位置 在C++中,我想对文件进行逐字节地打开和写入一些数据。但是,当我打开一个文件并向其中写入内容时,以前的内容正在丢失。如何将新数据预先添加到文件的开头并移动以前的内容。是否可能?怎么做 ofstream file; file.open("test.daf",app); file.seekp(0); file << 'A';

在不丢失文件内容的情况下写入文件中的特定位置 在C++中,我想对文件进行逐字节地打开和写入一些数据。但是,当我打开一个文件并向其中写入内容时,以前的内容正在丢失。如何将新数据预先添加到文件的开头并移动以前的内容。是否可能?怎么做 ofstream file; file.open("test.daf",app); file.seekp(0); file << 'A';,c++,C++,您可以对文件进行内存映射,并移动内容: int main() { prepend("data.dat", { 1,2,3,4,5,6 }); } 通过boost实现: 文件不是这样工作的,比如字符串等 您需要做的是加载文件的内容,将之前的内容放入文件,然后立即放回文件的旧内容 根据您的文件大小或性能,如果整个文件都是文本而不是二进制文件,您可以将其加载到字符串中,然后将该字符串附加到字符串中,然后将完整的字符串写入文件。 示例:string out_data=您的_数据+文件_数据 或

您可以对文件进行内存映射,并移动内容:

int main() {
    prepend("data.dat", { 1,2,3,4,5,6 });
}
通过boost实现:


文件不是这样工作的,比如字符串等

您需要做的是加载文件的内容,将之前的内容放入文件,然后立即放回文件的旧内容

根据您的文件大小或性能,如果整个文件都是文本而不是二进制文件,您可以将其加载到字符串中,然后将该字符串附加到字符串中,然后将完整的字符串写入文件。 示例:string out_data=您的_数据+文件_数据

或者像这样的二进制文件:

std::fstream f;
f.open ("test.daf", std::fstream::in | std::fstream::out | std::fstream::app);
f.seekg (0, f.end);
int length = f.tellg();
f.seekg (0, f.beg);

char * buffer = new char [length];
f.read (buffer,length);
f << 'A'; // Like you wanted it

// Or more binary data
char data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
f.write(data, 10);

f.write(buffer, length); // Finally put back the original content

f.close();

以上未经测试,可能不是最佳解决方案。出于性能原因,我不会在程序中多次使用此选项。

可能重复@Omnipotentity,因为它不是C,也不是预加字符。简言之,你感到困惑吗?事实上,他的意思是预习,他只是用了蹩脚的英语。而且没有这样的文件操作。用户,你必须创建一个新文件,写下新内容,然后附加真正附加的旧内容。@HansKlünder你说得对。仍然不是c的course@OmnipotentEntity很公平。无论如何,这个问题显然缺乏创造性的答案:我不知道这是可能的。美好的添加了一个非boost的C-only版本。只是因为它看起来很有趣,只是为了这个需要提高。
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

void prepend(const char* fname, char const* prepend_data, size_t n)
{
    struct stat s;
    stat(fname, &s);
    size_t size    = s.st_size;
    size_t resized = size + n;

    truncate(fname, resized);
    int fd = open(fname, O_RDWR);
    char* mapped_file = static_cast<char*>(mmap(NULL, resized, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));

    memmove(mapped_file + n, mapped_file, size);
    memcpy (mapped_file, prepend_data, n);
}

int main() {
    char const to_prepend[] = { 1,2,3,4,5,6 };
    prepend("data.dat", to_prepend, sizeof to_prepend);
}
std::fstream f;
f.open ("test.daf", std::fstream::in | std::fstream::out | std::fstream::app);
f.seekg (0, f.end);
int length = f.tellg();
f.seekg (0, f.beg);

char * buffer = new char [length];
f.read (buffer,length);
f << 'A'; // Like you wanted it

// Or more binary data
char data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
f.write(data, 10);

f.write(buffer, length); // Finally put back the original content

f.close();