c - 当使用 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
来自 的也会写入文件中:printf
len
len=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
现在我无法理解abcd
fromprintf
也如何插入到文件中 - 是不是因为数据中的数据printf
没有等待流出中的数据被刷新到文件中(由write()
first 插入),因此两者都被写入在文件中?
解决方案
你所拥有的是未定义的行为!具体来说,在对 的调用中write
,作为第二个参数,您给出了一个长度为的字符串文字,5
但告诉它,在第三个参数中,有9个字节。
在您的情况下,我假设编译器将abcd %ld
数据(也是字符串文字)紧跟在hello
数据之后的内存中,这就是它编写abcd
.
但顺便说一句,这不应该被依赖!这完全取决于编译器如何在内存中安排此类字符串文字数据。并且完全由程序员来确保“size”参数write
是有效的——你的值9
是无效的,因此是未定义的行为。
PS:调用write
将在调用函数之前执行- 这不是未定义的。printf
推荐阅读
- wpf - 数据库优先 ORM
- android - 无法成功托管云锚并从谷歌云锚 api 检索云锚 id
- ios - MTKView - 调整纹理大小以填充视图
- php - 如何使用 PHP 删除不包含指定字符串的行?
- ios - 条件绑定的初始化程序必须具有 Optional 类型,而不是 '(CLLocationCoordinate2D, String, UIColor) -> UIView'?
- jqgrid - 如何在网格中显示列并将其隐藏在视图对话框中
- sql-server - 在 T-SQL 中将 2 个表合并为 1 个单表
- mobx-state-tree - 从孩子那里获取父母数据
- c - 关于 C 中外部值的说明
- python - 通过python将csv数据导入mysql