本程序可通过以下命令行方式运行
假设aaa,bbb是两个文本文件
copyfile.exe aaa bbb
把文件aaa内容复制到bbb,如果bbb已经存在,aaa就会覆盖它,否则,就创建它,程序调用必须提供两个参数:第一个是输入文件,第二个是输出文件.
#include
#include
#include
#include //fcntl.h是unix标准中通用的头文件,其中包含的相关函数有open,fcntl,shutdown,unlink,fclose等
#include //是C和C++程序设计语言中提供对POSIX操作系统API的访问功能的头文件的名称
#define BUF_SIZE 4096
#define OUTPUT_MODE 0700
int main(int argc,char *argv[])
{
int in_fd,out_fd,rd_count,wt_count;
char buffer[BUF_SIZE];
if(argc!=3)
exit(1);
in_fd = open(argv[1],O_RDONLY);//O_RDONLY 以只读方式打开文件
if(in_fd<0)
exit(2);
out_fd = creat(argv[2],OUTPUT_MODE);
if(out_fd<0)
exit(3);
while(1)
{
rd_count = read(in_fd,buffer,BUF_SIZE);
if(rd_count<=0)
break;
wt_count = write(out_fd,buffer,rd_count);
if(wt_count <= 0)
exit(4);
}
close(in_fd);
close(out_fd);
if(rd_count == 0)
exit(0);
else
exit(5);
return 0;
}
//D:\Ccode\OS-读写文件\bin\Debug\OS-读写文件.exe D:\aaa.txt D:\bbb.txt
int main(int argc,char *argv[])
main有两个参数,第一个表示调用该程序时命令行中包含多少个字符串,包括该程序名argv[]应该包含指向下列值的指针:
argv[0] = "copyfile.exe"
argv[1] = "aaa"
argv[2] = "bbb"
在Codeblocks中调试时我们先选择Project,然后选择Project-Set Program’s Arguments,再按照下图设置
在此之前我们可以现在D盘下创建aaa,bbb两个文件
aaa中输入hello,bbb文件为空,运行程序后,会发现bbb文件内容与aaa内容相同.
首先声明了五个变量,(1)
in_fd和out_fd用来保存文件描述符,即打开一个文件时返回的一个小整数,(2)
rd_count和wt_count分别是由read和write系统调用所返回的字节数,(3)
最后一个buffer是用来保存读出的数据以及提供写入数据的缓冲区.
本文介绍文件的通用操作方法.先介绍如何建立文件,打开文件,读取和写入数据.
文件描述符
Linux下用文件描述符来表示设备文件和普通文件.文件描述符是一种整型的数据,所有对文件的操作东通过文件描述符实现.
文件描述符是连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程.进程用这个文件 描述符来对文件进行操作.用户空间的操作,例如读写一个文件时,将文件描述符作为参数传送给read或write.读写函数的系统调用到达内核时,内核解析文件描述符的整型变量,找出对应的设备文件相应的函数,并返回用户空间的结果.
文件描述符的范围是0-OPEN_MAX,因此是一个有限的资源,在使用完毕后用要及时释放,通常是调用close()函数关闭.文件描述符的值仅在同一个进程中有效.
在Linux系统中有3个已经分配的文件描述符,即标准输入,标准输出和标准错误,它们文件描述符的值分别为0,1,2.
打开创建文件open() create()函数
函数原型如下
int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode);
关闭文件close()函数