一、文件编程可使用两种:
1、linux系统调用
2、c语言库函数
1、系统调用
① int creat(const char* filename,mode_t mode)
filename ----------包含路径 :/home/joy/hello.c
mode ---------------S_IRUSR(1) S_IWUSR(2) S_IXUSR(4) S_IRWXU(7)
② 在linux中,所有打开的文件都对应一个
文件描述符。本质是一个非负整数。范围0---OPEN_MAX。
③ int open(const char * pathname,int flags) flags使用O_CREATE标志 使用下面,文件不存在的话会创建文件
int open(const char * pathname,int flags,mode_t mode)
④ int close (int fd)
fd-------文件描述符,open的返回值
⑤ int read(int fd,const viod *buf,size_t length) 返回值:实际读取的长度。
⑥ int write(int fd,const void *buf,size_t length) 返回值:实际写入的长度
⑦ int lseek(int fd, offset_t offset,int whence) 相对whence 移动offset(负数向前,正数向后) ,返回值:文件指针相对于头的位置。 whence 选项:SEEK_SET(头) SEEK_CUR(当前) SEEK_END(尾)
利用lseek来计算文件长度:lenth = lseek(fd, 0,SEEK_END);
⑧ int access(const char *pathname ,int mode)
mode-----要判断的访问权限 R_OK W_OK X_OK F_OK(文件存在) 判断符合 返回0,否则 -1.
终合实例:拷贝文件A的所有内容到B
#include
#include
#include
#include
#include
#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);
}
2、c语言库函数
① FILE *fopen(const char *filename,const char*mode)
filename------可包含路径
mode ----r,rb (b 是用于是否区分是不是二进制文件,linux下不区分二进制文件和文本文件)
-----w,wb
------a,ab
-----r+,r+b,rb+
---w+,w+b,wh+
---a+,a+b,ab+
② size_t fread(void *ptr,size_t size,siez_t n,FILE *stream)
从文件stream中读取 size*n的长度,放入ptr, 返回:实际读取的长度
③size_t fwrite(const void *ptr,size_t size,siez_t n,FILE *stream)
从ptr把 size*n的长度,写入stream文件,返回:实际写入的长度
④ int fgetc(FILE *stream)
从文件读出一个字符
⑤int fputc(int c,FILE* stream)
从文件中写入一个字符
⑥fscanf(FILE *stream,char *format[,argument..........])
从一个流中进行格式化输入
⑦fprintf(FILE *stream,char *format[,argument..........])
格式化输出到一个流中
⑧int fseek(FILE *stream,long offset,int whence)
方法见上
⑨char *getcwd(char *buffer,size_t size)
获取当前路径,路径信息会拷贝到buffer里面去,size指buffer长度,如果buffer太小,会返回0
⑩int mkdir(char *dir,int mode)
创建目录 0 成功 1出错