当与 write() 作为参数一起使用时,来自 printf 的数据被写入文件

data from printf getting written into file when used with write() as argument

我写这篇文章是为了在某个文件中写入一些数据:

//CODE 1
int retval=open("hello.txt",O_WRONLY|O_CREAT|S_IRUSR);
int len=6;

if(retval<0)
{
    printf("wrong\n");
}
else
    printf("abcd %ld",write(retval,"hello",len));

现在我注意到,如果我增加 len 的值(例如 len=9),printf 中的 abcd 也会写入文件中:

//CODE 2 with value of len=9
int retval;

while((retval=getchar())!=EOF)
{
    if(retval!='[=11=]')
        printf("%c",retval);
    else
    {
        printf("\n\nfound null-termination\n\n");
    }
}

第二个代码的输出是:

//value of len is 9 in this case
hello

found null-termination

abc

现在我不明白 printf 中的 abcd 是如何也被插入到文件中的 - 是因为 printf 中的数据没有等待out-stream 被刷新到文件中(首先由 write() 插入),因此两者都被写入文件中?

你遇到的是未定义的行为!具体来说,在对 write 的调用中,您将作为第二个参数给出一个长度为 5 的字符串文字,但告诉它,在第三个参数中,有 9 字节。

在你的例子中,我假设编译器将 abcd %ld 数据(也是一个字符串文字)紧跟在 hello 数据之后放在内存中,所以这就是它写 [=14= 的原因].

但是顺便说一句,这不应该被依赖!编译器如何在内存中排列此类字符串文字数据完全取决于编译器。并且完全由程序员来确保 write 的 "size" 参数是有效的——你的 9 的值是 not 有效,因此,未定义的行为

PS:对 write 的调用将在 调用 printf 函数之前执行 - 这是 不是未定义。