Linux学习----------文件IO
文件IO有两个标准
1.标准IO:Windows与Linux的通用IO规则-----标准c库
2.文件IO;专属于Linux的IO规则-----glibc
标准IO有主要的下面常用几个函数:fopen,fclose,fread,fwrite , fseek , ftell ,fgets.
stdin :从终端输入法入的文件—标准输入
stdout :从终端输出的文件-------标准输出
stderr :errno设置的对象------简称标准错误
int main(){
int ret;
/*
1.打开文件fopen
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
path: 文件路径,可以相对,也可以绝对地址(pwd)
mode: 打开权限
"r": 只读 readonly
"r+": read and write
"w": 不存在则创建,存在则清零文件,只写方式打开
"w+": 比 w增加了read权限,首先清空
"a": append, writeonly,以追加方式打开,不存在则创建
"a+": 增加read
return value:
success 返回文件指针,以后read write 都通过改指针进行
failed NULL
*/
FILE *fp=NULL;
fp = fopen("/目录/文件","r");
if(!fp){
printf("fopen err\n");
return -1;
}
/*
2.关闭文件fclose
#include <stdio.h>
int fclose(FILE *stream);
stream: 文件指针
return value:
0-----success
-1/EOF----failed
*/
ret = fclose(fp);
if(ret==EOF){
printf("fclose err\n");
return -1;
}
/*
3.读: 从物理文件读取内容到内存
#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-没有出错 其他-出错了
*/
char rbuf[128] = {0};
ret = fread(rbuf,1,sizeof(rbuf),fp);
if(ret ==0 ){
if( feof(fp) ){
printf("find end of file\n");
}else if( ferror(fp) ){
printf("find err of read\n");
return -1;
}
}
/* #include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
ptr:存放了要写入的数据
stream:文件指针
size,nmemb : 你要写入多少个块(nmemb),每个快有多大(size)
返回值:
实际写入的块个数 ,如果出错 返回值小于nmemb
*/
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 -1;
}
/*
自己设置文件的位置
##int fseek(long offset, FILE *fp);
int fseek(FILE *stream, long offset, int whence);
whence: SEEK_SET 从头部开始衡量,offset >=0
SEEK_CUR 从当前位置衡量 offset 可正可负
SEEK_END 从尾部开始衡量,offset<=0
返回值:0-success -1:failed
*/
ret = fseek(fp,0,SEEK_END);
if(ret ==-1){
printf("fseek err\n");
return -1;
}
/*
获取当前文件的位置: 相对于头部偏移量
long ftell( FILE *fp );
返回值: >=0: success
-1: failed
*/
long offset = ftell(fp);
/*
char *fgets(char *rbuf, int size, FILE *stream);
rbuf:存数据的buf
size:rbuf的大小
stream:文件指针
最多读取size-1个字符,最后一个存放‘\0’
读到一个换行符结束 ,或者读到文件结尾
读完结束之后,fgets它帮你添加一个'\0'
1) 遇到换行符,fgets结束,自动帮你在后面追加'\0'
2) 如果一行大小超过rbuf,则读取size-1个字符后,结束. 自动追加'\0'
如果一行没有读取完毕,下次继续读取改行.
thus,buf need尽可能的大
3)文件结束,添加'\0'结束.
返回值:
成功--返回rbuf
NULL- end of file , or error occurs
*/
char rbuf[1024] ;
while(1){
char *s = fgets(rbuf,sizeof(rbuf),fp);
if(s==NULL){
printf("find end of file\n");
return -1;
}
printf("%s",rbuf);
}
printf("\n");
//stdin
char rbuf[32]={0};
int i=0;
while(1){
fread(rbuf+i,1,1, stdin);
if( rbuf[i] == '\n' ){
printf("I got:%s",rbuf);
return 0;
}
i++;
}
//stdout
char *s="hello pc\n";
fwrite(s,1,strlen(s),stdout);
文件IO有主要的下面常用几个函数:open,close,read ,write ,lseek 。
0:对应为Linux中输入
1:对应为Linux的输出
2:对应为Linux的错误
int main(){
int ret;
/*打开文件
#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
*/
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 -1;
}
/*
#include <unistd.h>
int close(int fd);
返回值: 0 succes
-1 failed ,errno
*/
ret = close(fd);
if(ret <0){
perror("close err");
return -1;
}
/*
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符
buf: 数据存放的位置
count:你要求读多少数据,B
返回值:
实际读取的大小 0 表示文件结束
-1 failed,errno
*/
while(1){
char rbuf[33] = {0};
ret = read(fd,rbuf,sizeof(rbuf)-1);
if(ret < 0 ){
perror("read err");
return -1;
}else if(ret == 0){
printf("end of file\n");
return 0;
}
printf("%s",rbuf);
}
/*
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符
buf: 存放数据的buf
counte:你要求写入的大小B
返回值:
实际写入的大小
-1:失败,errno
*/
char wbuf[]="hello-----hi";
ret = write(fd,wbuf,strlen(wbuf));
if(ret < 0 ){
perror("write err");
return -1;
}
/* 获取/设置文件的位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符
offset:偏移量
whence:
SEEK_SET: 从头部开始计算 offset>=0
SEEK_CUR: 从当前位置计算 可正可负
SEEK_END: 从尾部开始计量
返回值:
成功 返回的是 当前位置距离头部的偏移量 >=0
失败 -1,errno
获取文件大小:
fsize=lseek(fd,0,SEEK_END);
*/
ret = lseek(fd,0,SEEK_CUR);
if(ret <0){
perror("lseek err");
return -1;
}
printf("lseek got current position:%d\n",ret);
}