嵌入式培训经验分享——通用标准IO操作

这篇博客详细介绍了C语言中的IO库函数,包括文件的打开、关闭、读取、写入等基本操作。通过`fopen`、`fclose`、`fread`、`fwrite`等函数,可以实现对文本文件的读写功能。文章还讲解了如何读取和写入单个字符、字符串,以及如何获取和设置文件位置。对于C语言初学者,这些基本的IO操作是必备的知识点。
摘要由CSDN通过智能技术生成

在学习了C语言之后,我们还有一个必须要知道的就是C语言自带的IO库函数,通过库函数我们可以对文本进行读写创建等等操作,可以将C语言的文本库理解为简单的数据库,可以存储数据和读取数据。

1、文本的打开

FILE *fp=NULL;
	fp = fopen("./test.txtx","r");
	if(!fp){
		printf("fopen err\n");
		return -34;
	}
	
	printf("fopen success\n");

        #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

2、文本的关闭

ret = fclose(fp);
	if(ret==EOF){
		printf("fclose err\n");
		return -3;
	}
	printf("close success EOF=%d\n",EOF);

        #include <stdio.h>

       int fclose(FILE *stream);
            stream: 文件指针
            return:
                0-success
                -1/EOF-  failed

3、文本的读取

	char rbuf[128] = {0};  
	int 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 -34;
		}
	}
	
	printf("got len=%d, data=%s\n",ret,rbuf);

        读: 从物理文件读取内容到 内存
        #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-没有出错  其他-出错了

4、文件的写入

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;
	}

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                FILE *stream);
                ptr:存放了要写入的数据
                stream:文件指针 
                size,nmemb : 你要写入多少个块(nmemb),每个快有多大(size)
            返回值:     
                    实际写入的块个数 ,如果出错 返回值小于nmemb

5、单个字符连续的读取

while(1)
{
    char c = fgetc(fpsrc);
		if(c==EOF){
			printf("file end\n");
			fclose(fpsrc);
			fclose(fpdst);
			return 0;
        }
}

int fgetc(FILE *stream);
            stream:文件
            返回值:     -1,文件结束
                          成功,记得到一个字符  (char)

6、单个字符的写入

	char m = fputc(c,fpdst);
		if(m==EOF){
			printf("fputc err\n");

            int fputc(int c, FILE *stream);                
                返回值: 就是你写入的字符c, 出错返回-1/EOF

7、字符串的读取

	char rbuf[1024] ;
	while(1){
		char *s = fgets(rbuf,sizeof(rbuf),fp);
		if(s==NULL){
			printf("find end of file\n");
			return -3;
		}
		printf("%s",rbuf);
	}

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
                如果一行没有读取完毕,下次继续读取改行.
                    so,buf尽可能的大
            3)文件结束,添加\0结束.
            
            返回值:
                成功--返回rbuf
                NULL- end of file , or error occurs
    8、获取文件位置指针

ret = fseek(fp,0,SEEK_END);
	if(ret ==-1){
		printf("fseek err\n");
		return -3;
	}

        ##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

9、获取文件偏移量

long offset = ftell(fp);
	printf("fp offset %ld\n",offset);

    获取当前文件的位置: 相对于头部偏移量
        long ftell( FILE *fp );
        返回值:    >=0   success
                    -1:  failed

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值