文件编程总结(系统调用)
时间:2010-07-28 来源:冰蓝血
文件创建:
int creat(const char *filename, mode_t mode)
filename即为将创建的文件的路径加文件名,如直接给出文件名则在当前目录下创建该文件,mode为创建模式常见的有:
S_IRUSR(可读,数字1表示)、S_IWUSR(可写,数字2表示)、S_IXUSR(可执行,数字4表示)、S_IRWXU(可读、写、执行)
返回值小于0表示创建失败。
文件打开:
A) int open(const char *pathname, int flags)
B) int open(const char *pathname, int flags, mode_t mode)
pathname为将打开的文件的路径,flags为打开标志,常见标志有:
O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_APPEND(追加方式)、O_CREAT(创建方式)、O_NOBLOCK(非阻塞方式)
如果使用了O_CREAT标志,则函数原型如B)所示,mode为创建模式。返回文件描述符(对应打开文件的一个整型数)
文件关闭:
int close(int fd)
fd为文件描述符
文件读取:
int read(int fd, const void *buf, size_t length)
从文件描述符fd指定的文件读取length个字节到缓冲区buf中,返回值为实际读取的字节数
文件写入:
int write(int fd, const void *buf, size_t length)
将缓冲区buf中的length个字节写入到fd所指向的文件中,返回值为实际写入的字节数。
文件定位:
int lseek(int fd, offset_t offset, int whence)
将文件读写指针相对whence移动offset(取正值表示向后移动,取负值则表示向前移动)个字节。返回为文件指针相对文件头的位置
whence常见的值如下:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
文件访问判断:
int access(const char *pathname, int mode)
pathname:文件路径,
mode:要判断的访问权限。可取如下值(可多个组合)
R_OK(文件可读)、W_OK(文件可写)、X_OK(文件可执行)、F_OK(文件存在)
测试成功时返回0,否则返回-1
实例程序(文件复制): #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h> #define BUFFER_SIZE 1024 int main(int argc,char **argv)
{ int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr; if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
exit(1);
} /* 打开源文件 */ if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
exit(1);
} /* 创建目的文件 */ if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
} /* 以下代码是一个经典的拷贝文件的代码 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break; }
}
close(from_fd);
close(to_fd);
exit(0);
}
文件访问判断:
int access(const char *pathname, int mode)
pathname:文件路径,
mode:要判断的访问权限。可取如下值(可多个组合)
R_OK(文件可读)、W_OK(文件可写)、X_OK(文件可执行)、F_OK(文件存在)
测试成功时返回0,否则返回-1
实例程序(文件复制): #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h> #define BUFFER_SIZE 1024 int main(int argc,char **argv)
{ int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr; if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
exit(1);
} /* 打开源文件 */ if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
exit(1);
} /* 创建目的文件 */ if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
} /* 以下代码是一个经典的拷贝文件的代码 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)break; }
}
close(from_fd);
close(to_fd);
exit(0);
}
相关阅读 更多 +