首页 > 解决方案 > 当使用 write() 作为参数时,来自 printf 的数据被写入文件

问题描述

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

//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));

现在我注意到,如果我增加(比如说)的值,abcd来自 的也会写入文件中:printflenlen=9

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

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

第二个代码的输出是:

//value of len is 9 in this case
hello

found null-termination

abc

现在我无法理解abcdfromprintf也如何插入到文件中 - 是不是因为数据中的数据printf没有等待流出中的数据被刷新到文件中(由write()first 插入),因此两者都被写入在文件中?

标签: csystem-calls

解决方案


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

在您的情况下,我假设编译器将abcd %ld数据(也是字符串文字)紧跟在hello数据之后的内存中,这就是它编写abcd.

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

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


推荐阅读