曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4062|回复: 2
打印 上一主题 下一主题

复制文件

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-2-7 20:32:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设有已经存在一文件 file.in ,需要把其中的内容复制到 file.out 文件中。如果 file.out文件不存在就创建。file.out 文件权限属性为只允许拥有者本身有读写权限。


例一代码
#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);
}

说明:
#include <unistd.h> 必须放在第一行,因为它定义的遵照 POSIX 标准的标志可能会影响到其他的 include 文件。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2009-2-12 00:34:03 | 只看该作者
使用库函数来实现复制

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int c;
        FILE *in, *out;

        in = fopen("file.in","r");
        out = fopen("file.out","w");

        while((c = fgetc(in)) != EOF)
                fputc(c.out);

        exit(0);
}


说明:
对于复制同一个文件,这个例子中的复制程序的速度要好于第一个(single-character-at-a-time)。这是因为,stdio 库在 FILE 结构中维持一个内部缓冲区,而 low-level 调用只有当缓冲区填充了才会开始。也就是说,一经 fopen 打开文件后,就会读取数据填充缓冲区,在读取数据时直接从缓冲区中拿;对于 low-level 的系统调用,打开一次,就从磁盘中拿一次到缓冲区中,然后再从缓冲区中再取出数据,如果多次读取数据,则速度明显下降。(后面的解释,是个人理解,尚未得到验证,这里做个记号)

TIMEFORMAT="" time ./copy-3.exe //计算程序运行的时间,TIMEFORMAT 为指定显示的时间格式

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
板凳
 楼主| 发表于 2009-2-7 22:25:49 | 只看该作者

提高复制文件效率

代码
一次 1K 字节的块来赋值,提高了复制的速度。
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
        char block[1024];
        int in,out;
        int nread;

        in  = open("file.in", O_RDONLY);
        out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
        while((nread = read(in, block, sizeof(block))) > 0 )
                write(out,block,nread);

        exit(0);


}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:03 , Processed in 0.079704 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表