文件IO与标准IO

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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做最好的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值