当与 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
函数之前执行 - 这是 不是未定义。
我写这篇文章是为了在某个文件中写入一些数据:
//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
函数之前执行 - 这是 不是未定义。