C++ 使文件指针读/写到内存中的位置

C++ 使文件指针读/写到内存中的位置,c++,c,C++,C,我可以使用fopen()使文件指针写入文件。但是,我可以创建一个文件指针,使其能够调用函数(如fputc或fprintf)写入内存中的指针吗?java中的ByteArrayOutputStream就是一个例子。另外:我可以反向运行它吗?库需要从中读取文件指针,因此我分配内存,并创建一个新的文件指针,该指针将从该内存位置读取,但在块大小用完时返回EOF?(如Java中的ByteArrayInputStream)。在C语言中有这样做的方法吗?例如: FILE *p = new_memory_file

我可以使用fopen()使文件指针写入文件。但是,我可以创建一个文件指针,使其能够调用函数(如fputc或fprintf)写入内存中的指针吗?java中的ByteArrayOutputStream就是一个例子。另外:我可以反向运行它吗?库需要从中读取文件指针,因此我分配内存,并创建一个新的文件指针,该指针将从该内存位置读取,但在块大小用完时返回EOF?(如Java中的ByteArrayInputStream)。在C语言中有这样做的方法吗?例如:

FILE *p = new_memory_file_pointer();
fprintf(p, "Hello World!\n");
char *data = get_written_stuff(p);
printf("%s", data); //will print Hello World!
&&/||

char s[] = "Hello World!\n";
FILE *p = new_memory_file_pointer_read(s, sizeof(s));
char *buffer = (char *)malloc( 1024*sizeof(char) );
fread((void *)buffer, 1, sizeof(s), p);
printf("%s", buffer); //prints Hello World!

EDIT:对于多年后阅读此问题的读者,除了公认的答案之外,您还应该看看
open\u memstream(3)
,它的行为比
fmemopen
更像这些Java类

正如Ise恰当地指出的那样,在中有一个用于此的函数,它在Linux上受支持。使用,可能最接近的方法是使用临时文件:

// This is for illustration purposes only. You should add error checking to this.
char name[] = "/tmp/name-of-app-XXXXXX";
int temporary_descriptor = mkstemp(name);
unlink(temporary_descriptor);
FILE* file_pointer = fdopen(temporary_descriptor, "r+");
// use file_pointer ...
倒过来比较容易;也就是说,拥有一个写入内存的函数,然后使用它写入内存和写入文件。您可以使用,以便一块内存最终由一个文件备份,并写入该内存,将数据写入关联文件

如果使用 STD::ISTRAM和 STD::OsStase代替低级C文件*对象,则C++方便地提供<>代码> STD::ISTIGISSWORDS STD::OSTRIGSWORKS/<代码>读写字符串。


您将注意到,C中几乎所有以“f”开头并对文件进行操作的函数,都具有以“s”开头并对字符串进行操作的等价函数。也许更好的方法是设计一个不特定于文件或字符串的I/O接口,然后提供分别连接到文件和字符串的实现。然后在这个接口中实现你的核心逻辑,而不是在低级别C和C++中,I/O.这样做也有利于将来的扩展,比如支持网络文件,支持压缩、复制等等。

< P>如果你的操作系统提供,
它可能会满足您的需要。

带有内存映射文件。这是特定于平台的,因此您需要查找有关在目标系统上创建mem映射文件的信息。我相信posix版本是
mmap
。无论如何,在谷歌上搜索“内存映射文件”应该会带来一系列帮助。在C++中(

)(并且添加C++标签),你可以编写一个函数来接受任意的输入/输出流。由于
std::stringstream
std::ofstream
都是派生类,因此可以将这两个类平等地传递到此函数中。例如:

#include <iostream> // for std::cout
#include <fstream> // for std::ofstream
#include <sstream> // for std::stringstream

void write_something(std::ostream& stream) {
  stream << "Hello World!" << std::endl;
}

int main() {
  write_something(std::cout); // write it to the screen
  {
    std::ofstream file("myfile.txt");
    write_something(file); // write it into myfile.txt
  }
  {
    std::stringstream stream;
    write_something(stream); // write it into a string
    std::cout << stream.str() << std::endl; // and how to get its content
  }
}

需要明确的是,当您使用
fopen()
时,您并不是在创建指向该文件的指针,而是指向表示该文件的结构的指针。@Jeff M我知道。我刚才用了“文件指针”这个词,可能是重复的,你是不是真的想把一个六年前的问题标记为一个八年前的问题的重复,而这个问题没有一个公认的答案?编辑们不是有更好的事要做吗?我知道,如果代码完全在内存中,设计代码会工作得最好,但是,一个已经存在的文件需要什么文件?我添加了标签C++,所以只看到标签C++而不是C的人会看到我的问题。@ Leo Izen:C++用户会给出C++答案。不,这是获得指向虚拟内存区域的指针的一种方法。他想要一个由内存支持的虚拟文件,而不是由文件支持的虚拟内存。
void read_into_buffer(std::istream& stream, char* buffer, int length) {
  stream.read(buffer, length);
}

int main() {
  char* buffer = new char[255];

  {
    std::ifstream file("myfile.txt");
    read_into_buffer(file, buffer, 10); // reads 10 bytes from the file
  }
  {
    std::string s("Some very long and useless message and ...");
    std::stringstream stream(s);
    read_into_buffer(stream, buffer, 10); // reads 10 bytes from the string
  }
}