gpt4 book ai didi

c - printf(或 fprintf 或 dprintf)返回的 ("successfully"可能比 "all bytes"的数量少(但非负)?

转载 作者:太空狗 更新时间:2023-10-29 15:31:49 27 4
gpt4 key购买 nike

手册上说

Upon successful return, these functions [printf, dprintf etc.] return the number of characters printed.

手册没有提到这个数字可能小于(但非负)“最终”(替换和格式化完成)字符串的长度。也没有提到如何检查(或实现)字符串是否完全写入。

dprintf 函数对文件描述符进行操作。类似于 write 函数,手册确实提到了

On success, the number of bytes written is returned (zero indicates nothing was written). It is not an error if this number is smaller than the number of bytes requested;

因此,如果我想完整地编写一个字符串,那么我必须将 n = write() 包含在一个 while 循环中。在 dprintfprintf 的情况下,我是否也必须这样做?

最佳答案

我对documentation的理解dprintf 要么失败要么输出所有输出。但我同意这是一些灰色地带(我可能不太理解);我猜测部分输出是某种失败(因此返回负大小)。

这里是 musl-libc 的实现:

stdio/dprintf.c dprintf 函数只是调用 vdprintf

但是在stdio/vdprintf.c你只有:

static size_t wrap_write(FILE *f, const unsigned char *buf, size_t len)
{
return __stdio_write(f, buf, len);
}

int vdprintf(int fd, const char *restrict fmt, va_list ap)
{
FILE f = {
.fd = fd, .lbf = EOF, .write = wrap_write,
.buf = (void *)fmt, .buf_size = 0,
.lock = -1
};
return vfprintf(&f, fmt, ap);
}

所以 dprintf 返回的大小类似于 vfprintf(和 fprintf....)。

但是,如果您真的担心,最好使用snprintfasprintf 输出到一些内存缓冲区,并显式使用write(2)。在那个缓冲区上。

查看stdio/__stdio_write.c __stdio_write 的实现(它使用 writev(2) 和一个循环中的两个数据 block 的 vector )。

换句话说,我通常不在乎;但是如果你真的需要确保每个字节都按照你的预期写入(例如,如果文件描述符是某个 HTTP 套接字),我建议缓冲显式(例如通过调用snprintf 和/或 asprintf) 自己,然后使用您的显式 write(2) .

附言。您可以自行检查您的 提供dprintf 的特定C 标准库的源代码;对于 GNU glibc,请特别注意 libio/iovdprintf.c

关于c - printf(或 fprintf 或 dprintf)返回的 ("successfully"可能比 "all bytes"的数量少(但非负)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com