Linux的C语言标准库IO接口

文件操作函数

在Linux中,甚至是其他设备中,总是需要利用C语言实现操作文件的内容,所谓文件操作,无非就是开关读写几个功能。它们在C语言中,包括最底层的系统调用的版本,以及经过封装之后的标准库版本。

标准库IO接口

标准库IO接口是基于系统调用IO接口实现的,使用的权限没那么大,但是玩法更加多。主要包括了fopen、fwrite、fread、fseek、fclose。

函数内容

1、fopen

函数声明为:
*FILE * fopen(const char * path,const char mode)
这个函数是用于 打开文件,其中path就是需要打开的文件的路径名,如果不带路径的话,就是指当前目录。
这里需要提到的是文件打开操作中的灵魂:mode,也就是文件的打开方式,主要有七种:

打开方式的写法对应的功能
r只读(注:1不能写,写了就会报错2.如果文件不存在,则报错返回)
r+可读可写
w只写(注:1.若文件存在,则清空内容 2.若文件不存在,则创建)
w+可读可写
a追加写入(注:1.只写在文件末尾 2.若文件不存在,则创建)
a+从头读,追加写 (注:若文件不存在,则创建)
b生成原始二进制文件项目

返回值:FILE * 文件流指针
其本质为:文件操作句柄,如果失败,返回NULL

2、fwrite

函数声明为:
size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);

其中ptr需要写入文件的数据size块大小nmemb块个数
这里需要注意的是,此处的写入长度用了两个维度来表示,也就是说:
块 大 小 ∗ 块 个 数 = 块 总 长 度 块大小 * 块个数 = 块总长度 =
为了防止出现写入不完全的情况,多数情况下认为块大小为1,用块个数来表示长度。

stream为上一步fopen返回的操作句柄,其对应了要操作的文件。

该函数的返回值为:成功返回写入文件的完整块个数,如果未完全写入返回0,失败返回0.

3、fread

函数声明为:
size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);

这个函数实现的是,将文件流指针的数据读入ptr空间当中。其中ptr为一块内存空间,用于存放读取到的数据,size表示块大小,nmemb表示块的个数。stream表示fopen返回的操作句柄。

返回值为:成功时返回实际读取到的完整块的个数,如果读到末尾返回0。失败时返回0.所以如果返回的是0时,是存在歧义的

提一嘴,尽量让fread和fwrite的size定为1.

4、fseek

函数声明为:
int fseek(FILE * stream, long offset, int whence);
这个函数的功能是改变跳转文件读写的位置。其中,stream为fopen返回的文件句柄,offset为偏移量,需要重点强调的是whence,它是相对偏移起始位置。

whence位置
SEEK_SET文件起始位置
SEEK_CUR当前位置
SEEK_END文件末尾

返回值为:成功时返回0,失败时返回-1。

5、fclose

函数声明为:
int fclose(FILE * fp);
这个函数实现的是关闭文件流,释放资源。
这里需要注意的是,fclose和fopen必须是成对存在的,不可以多次fopen对应一次fclose,对于一个循环而言,不能将fopen放入循环内,而将fclose放在循环外。

代码实现

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
    FILE *fp = fopen("./test2.txt"."w+");
    if(fp == NULL)
    {
        perror("error!\n");
        return -1;
    }
    const char* ptr = "this is the input text of ffile.c\n";
    int ret = fwrite(ptr,strlen(ptr),1,fp);
    if(ret == 0)
    {
        perror("write error!\n");
        return -1;
    }
    printf("%d\n",ret);

    fseek(fp,0,SEEK_SET);

    char buf[1024] = {0};

    ret = fread(buf,20,50,fp);

    if(ret == 0)
    {
        if(feof(fp))
        {
            printf("this is the end of file\n");
        }
        if(ferror(fp))
        {
            perror("write error!\n");
        }
    }
    printf("%d-%s\n",ret,buf);
    fclose(fp);
    return 0;
}

得到的结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值