c - 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;
}
解决方案
您可以使用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 中。
推荐阅读
- python - 将 txt 文件传递到 pandas 数据帧
- postgresql - 无法从 Tableau srv 连接到 PostgreSQL srv
- php - Symfony 4.4 Auth0 如何从应用程序中完全注销用户
- covariance-matrix - rmvnorm 警告消息:sigma 在数值上不是半正定的
- multithreading - PowerShell 中的 Control.BeginInvoke
- python - 当我使用 beautifulsoup 刮亚马逊时,我没有得到任何输出
- postscript - 写入文件时等价于 ==
- nearprotocol - 在 indexer sync 附近,为什么归档设置为 false 会占用这么多空间?
- python - Python中热图中的索引形状问题
- css - Safari web-inspector(CSS 编辑器)漏洞百出