linux - C语言底层复制小程序,有几个细节不懂?
阿神
阿神 2017-04-17 11:36:28
[Linux讨论组]

我在学习《Linux程序设计》- 底层文件访问 时遇到了这段代码,它是一个文件复制程序:

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
    char c;
    int in, out;

    in = open("file.in", O_RDONLY);
    out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
    while(read(in,&c,1) == 1) 
        write(out,&c,1);

    exit(0);
}

Q:这两行没看懂,特别是&c和3个数字1?

while(read(in,&c,1) == 1) 
    write(out,&c,1); 

提前感谢回答问题的朋友们!

阿神
阿神

闭关修行中......

全部回复(3)
ringa_lee

read()函数的第二个参数表示要将读取的的数据存放到哪里,第三个参数表示想要一次读取的数据大小,返回值表示实际读取的数据大小

所以
read()第二个参数是&c、第三个参数是1 表示读取一个字节,将其保存到变量c中,然后判断read()返回值是否是1,如果不是的话表示文件读取完毕,则会退出while循环
write()类似,第二个参数和第三个参数联合起来表示将变量c中的那一个字节保存到文件中。

伊谢尔伦

这个问题的,我来试试看能不能给你说个明白。
read()函数简单地说作用就是从描述符fd(作为第一个参数,对应问题中的in或者out)读取n个字节(作为第三个参数)到buffer中(作为第二个参数,也就是题目中的c)。
关键点:1)目的地是第二个参数。2)函数的返回值要么判断函数是否执行成功要么知道实际读取了多少字节。
函数改变了目的地的内容,
我来给你举个例子:

#include    <stdio.h>
int read( int *p )
{
    int b = 20;
    *p = b;
    return 1;
 }
  int main()
 {
      int a = 10;
      if( ( read( &a ) ) == 1 )
         printf( "a:%d\n", a );
    return 0;
 }

变量a就相当于我们要修改的目的地。一开始是10,但是后来经过了read()函数却变成了20。

黄舟

既然在学linux,那么对于使用的函数用man查一下,多看看文档

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号