C语言文件IO
这次学的主要是linux系统下c语言的io编程
文件IO
open函数
open函数的定义如下:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);
其中返回值为文件描述符,如果打开失败则返回-1
第一个参数pathname是字符串,输入打开文件的路径
第二个参数flags是标志位,多个组合用 | 隔开
第三个参数mode,在用creat标志的时候要写上权限
感觉上能用标志的如下:
标志 | 含义 |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 读写 |
O_APPEND | 写入时在后面追加 |
O_CREAT | 若不存在则创建 |
··· | ··· |
close函数
close函数的定义如下:
int close(int fd);
使用方法很简单,返回值0表示成功,返回-1表示失败。
fd是之前open()的返回值,表示关闭打开的某文件。
和open()成对使用
read函数
定义:
ssize_t read(int filedes, void *buf, size_t nbytes);
返回值表示读到的大小,如果是-1表示失败
第一个参数filedes是open返回的文件描述符
第二个参数表示要读到的缓存区
第三个参数表示读取的长度
write函数
定义:
ssize_t write(int filedes, const void *buf, size_t nbytes);
与read类似:
返回值表示写入的大小,-1表示失败
第一个参数是open返回的文件描述符
第二个参数是写入的缓存区
第三个是写入的字节数
基于文件IO的文件拷贝程序
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
#include "string.h"
int main(int argc,char *argv[]){
int rd_fd,wr_fd;
char read_buf[128] = {0};
int rd_ret = 0;
if(argc < 3){
printf("Please input src file and dst file \n");
return -1;
}
rd_fd = open(argv[1],O_RDONLY);
if(rd_fd < 0){
printf("open src file %s error\n",argv[1]);
return -2;
}
printf("open src file %s success, rd_fd = %d\n",argv[1],rd_fd);
wr_fd = open(argv[2],O_WRONLY|O_CREAT,0600);//不存在就创建,权限0600
if(wr_fd < 0){
printf("open dst file %s error\n",argv[2]);
return -3;
}
printf("open dst file %s success, wr_fd = %d\n",argv[2],wr_fd);
while(1){
rd_ret = read(rd_fd,read_buf,128);
if(rd_ret < 128){
break;
}
write(wr_fd,read_buf,rd_ret);
memset(read_buf,0,128);
}
write(wr_fd,read_buf,rd_ret);
close(rd_fd);
close(wr_fd);
return 0;
}
标准IO
标准io是"stdio.h"定义的一系列函数,也有关于文件的IO函数,优势是移植性比文件IO好。
fopen函数
fopen()与open()类似
FILE * fopen(const char * path,const char * mode);
返回参数是FILE指针,NULL表示失败
第一个参数path是文件名
第二个参数mode是读写规则
mode | 含义 |
---|---|
r | 只读 |
w | 只写(覆盖),不存在就创建 |
w+ | 读写(覆盖),不存在就创建 |
a | 只写(追加),不存在就创建 |
a+ | 读写(追加),不存在就创建 |
(b) | 对应的二进制文件,例如wb+表示二进制读写覆盖 |
··· | ··· |
fclose函数
类似close()
int fclose(FILE *stream)
返回值0表示成功,-1表示失败
参数stream是打开的FILE指针
fread函数
类似read(),但是顺序有变
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
返回值是读取的长度,-1表示失败
buffer:是读取到的缓存位置,数据去向
size:是读取的大小
count:表示数据个数,一般用1
stream:是fopen()返回的指针
fwrite函数
类似write(),顺序有变
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值是写入的大小
buffer:写入数据的缓存位置,数据来源
size: 大小
count: 个数,一般是1
stream:文件指针,fopen()打开的
基于标准IO的文件拷贝程序
其中的注释是和上一个程序的差异
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
#include "string.h"
int main(int argc,char *argv[]){
//int rd_fd,wr_fd;
FILE *rd_fd,*wr_fd;
char read_buf[128] = {0};
int rd_ret = 0;
if(argc < 3){
printf("Please input src file and dst file \n");
return -1;
}
//rd_fd = open(argv[1],O_RDONLY);
rd_fd = fopen(argv[1],"r");
//if(rd_fd < 0){
if(rd_fd == NULL){
printf("open src file %s error\n",argv[1]);
return -2;
}
printf("open src file %s success, rd_fd = %d\n",argv[1],rd_fd);
//wr_fd = open(argv[2],O_WRONLY|O_CREAT,0600);
wr_fd = fopen(argv[2],"w");
//if(wr_fd < 0){
if(wr_fd==NULL){
printf("open dst file %s error\n",argv[2]);
return -3;
}
printf("open dst file %s success, wr_fd = %d\n",argv[2],wr_fd);
while(1){
//rd_ret = read(rd_fd,read_buf,128);
rd_ret=(int)fread(read_buf,1,128,rd_fd);
if(rd_ret < 128){
break;
}
//write(wr_fd,read_buf,rd_ret);
fwrite(read_buf,1,rd_ret,wr_fd);
memset(read_buf,0,128);
}
//write(wr_fd,read_buf,rd_ret);
fwrite(read_buf,1,rd_ret,wr_fd);
fclose(rd_fd);
fclose(wr_fd);
close(rd_fd);
close(wr_fd);
return 0;
}
暂时就这样