首页 > 解决方案 > C 是否有允许将 fprintf 转换为字符串的功能?

问题描述

在 Common Lisp 中,解析或写入的内容并不重要——无论是文件、字符串还是其他序列。make-string-input-stream,make-string-output-stream等函数with-input-from-string允许使用与在文本文件(或套接字,可能)上相同的函数进行读取和写入。

我一直想知道,但从来没有找到任何确定的东西,关于是否可以在 C 中做同样的事情,无论是使用文件描述符(int fd)还是使用文件流(FILE*)。

所以,问题是,如果有类似的东西,如果有,它是什么样子的?

#include <stdio.h>

void foo( FILE* out, const char* message) {
  fprintf(out, "%s\n", message);
}
int main( int argc, const char* argv[]) {
  char buffer[300];
  FILE* os = open_string_output_stream(buffer, 300);
  foo( os, "Hello World");
  close_string_output_stream(os);
  // buffer now contains "Hello World\n"
  return 0;
}

标签: c

解决方案


您可以使用snprintf(3)。您必须预先分配一个缓冲区(已知大小)。

在带有GNU libc的Linux 上,您还拥有asprintf(3)。您甚至可以进入使用open_memstream(3)获得fprintf的不断增长的内存缓冲区(伪装为 a ) 。FILE*

这是 Linux 或 GNU libc 特定的。

请注意,GNU libc 是免费软件,您可以下载并学习 - 然后改进 - 它的源代码。

在许多操作系统上,您可以写入一些临时文件(并使用atexit(3)注册它的删除)。如果可移植性是一个主要问题,请使用tmpfile(3)并记录您的软件正在使用它(然后系统管理员可以配置操作系统,例如在 Linux 上/tmp/的某些tmpfs文件系统中具有)。由于页面缓存,临时文件很可能在 RAM 中。


推荐阅读