文件IO与标准IO
通过代码实现对文件的创建、删除、修改等操作。
在Linux中对文件的访问我们主要使用到到标准io 与文件io两种接口。
标准io 是由标准c库提供的 通用的 只针对普通的文件
文件io linu系统特有的使用的是GLIBC库 针对linu所有文件
注:linux除了支持普通文件外,还支持很多特有的文件,因为linux把一切都看做了文件.
标准io
常用操作
fopen fwritte fread fclose
/*
argc 表示这个传参的个数 printf("argc=%d\n",argc);
for(int i=0;i<argc;i++){
printf("%d %s\n",i,argv[i]);
}
*/
打开文件
/*
1.打开文件fopen
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
path:文件路径,可以相对,也可以绝对地址
mode: 打开权限
"r": 只读 readonly
"r+": read and write
"w": 不存在则创建,存在则清零文件,只写方式打开
"w+": 比 w增加了read权限,首先清空
"a": append, writeonly,以追加方式打开,不存在则创建
"a+": 增加read
返回值:
success 返回文件指针,以后read write 都通过改指针进行
failed NULL
*/
写入文件
/* #include <stdio.h>
写入文件
//int fwrite(char *wbuf, int size, FILE *fp)
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
ptr:存放了要写入的数据
stream:文件指针
size,nmemb : 你要写入多少个块(nmemb),每个快有多大(size)
返回值:
实际写入的块个数 ,如果出错 返回值小于nmemb
*/
读文件
/*
读: 从物理文件读取内容到 内存###int fread(char *ptr, int size ,FILE *fp)
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:存放数据的buf,你分配的空间
stream:上面打开的文件描述符
size, nmemb: 我们一次要读取很多块(num member block),每块多大(size B)
返回: 实际读取的 块个数
0: 1) 没有数据了 2)出错了
你要使用 int feof(FILE *fp); 0-没有结尾 其他-结尾
int ferror(FILE *fp) 0-没有出错 其他-出错了
*/
关闭文件
/*
#include <stdio.h>
int fclose(FILE *stream);
stream: 文件指针
return:
0-success
-1/EOF- failed
*/
代码:
#include<stdio.h>
#include<string.h>
int main(int argc,char **argv)
{
int ret;
FILE *fp=NULL;
fp = fopen("./test.txt","r+");
if(!fp){
printf("fopen err\n");
return -34;
}
printf("fopen success\n");
char wbuf[64]="good good study ,day day up!";
ret = fwrite(wbuf,1,strlen(wbuf),fp);
if( ret < strlen(wbuf) ){
printf("write err\n");
return -34;
}
fclose(fp);
fp=fopen("./test.txt","r");
if(!fp){
printf("fopen err\n");
return -34;
}
while(1){
char rbuf[33] = {0};
ret = fread(rbuf,1,sizeof(rbuf)-1,fp); //为了最后是个\0
if(ret == 0 ){
if( feof(fp) ){
printf("find end of file\n");
break;
}else if( ferror(fp) ){
printf("find err of read\n");
return -34;
}
}
printf("%s",rbuf);
}
printf("\n");
/*
#include <stdio.h>
int fclose(FILE *stream);
stream: 文件指针
return:
0-success
-1/EOF- failed
*/
ret = fclose(fp);
if(ret==EOF){
printf("fclose err\n");
return -3;
}
printf("close success EOF=%d\n",EOF);
return 0;
}
文件io
打开文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname,文件路径
flags: 他是一个32bit的整数,
每一个bit表示文件的一种属性,比如 某个bit置一表示文件可写,置零表示不可写
O_RDONLY 只读
O_WRONLY 只写
O_RDWR: 读写
上述三个必须包含一个.
O_APPEND: append-追加
O_CREAT: 创建
可以指定一个权限, mode指定权限
只有flags参数中包含O_CREAT,mode才能使用
0660,表示这是一个 八进制 0x12 23 023
O_TRUNC: 如果文件存在,则清空
返回值:
成功返回一个 文件描述符, 正数
失败: -1, errno
写入文件
/*
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符
buf: 存放数据的buf
counte:你要求写入的大小B
返回值:
实际写入的大小
-1:失败,errno
*/
读文件
/*
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符
buf: 数据存放的位置
count:你要求读多少数据,B
返回值:
实际读取的大小 0-表示文件结束
-1 failed,errno
*/
关闭文件
/*
#include <unistd.h>
int close(int fd);
返回值: succes-0
-1 failed ,errno
*/
代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main()
{
int ret;
int fd = open("./test.txt", O_CREAT|O_RDWR,0666);
//int fd=open("./test.txt",O_RDONLY);
//int fd=open("./test.txt",O_WRONLY);
if(fd < 0){
printf("open errno=%d %s\n",errno,strerror(errno));
perror("open err");
return -3;
}
char wbuf[]="base test.";
ret = write(fd,wbuf,strlen(wbuf));
if(ret < 0 ){
perror("write err");
return -9;
}
return 0;
while(1){
char rbuf[33] = {0};
ret = read(fd,rbuf,sizeof(rbuf)-1);
if(ret < 0 ){
perror("read err");
return -3;
}else if(ret ==0){
printf("end of file\n");
return 0;
}
printf("%s",rbuf);
}
ret = close(fd);
if(ret <0){
perror("close err");
return -3;
}
return 0;
}