fb与FILE

本文详细介绍了UNIX系统中open与fopen的区别,重点解析了文件描述符(File Descriptor)的概念,强调其作为文件在文件描述符表中的索引作用。在Linux系统中,一切皆文件,每个进程都有一个文件描述符表,文件描述符是表的索引,用于找到对应的文件指针。此外,还提到了FILE在C语言中的应用,以及fopen、fread、fwrite和fclose等函数的使用。

open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。

1.fb文件描述符

注:这些我们都在上次博客中写到过,有兴趣的朋友可以去看看。


在Linux系统中一切皆文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(默认最大1024),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。

文件描述符的操作(如: open(),creat(),close(),read()))返回的是一个文件描述符,它是int类型的整数,即fd,其本质是文件描述符表中的下标,它起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针; 已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。每打开一个文件,fd默认从最小的未被使用的下标开始分配。

查看默认文件描述符的大小:
这里写图片描述

2.FILE:

FILE:我们称之为文件指针,

fopen:

FILE *fopen(const char *path, const char *mode);

FILE *fdopen(int fd, const char *mode);

FILE *freopen(const char *path, const char *mode, FILE *stream);
//-- path: 文件路径,如:"./text.txt"  
//    -- mode: 文件打开方式,例如:  
//             "r" 以只读方式打开文件,该文件必须存在。  
//             "w" 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。  
//            "w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。  
//             "a" 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)  
//           "a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)  
//            "wb" 只写打开或新建一个二进制文件,只允许写数据。  
//            "wb+" 读写打开或建立一个二进制文件,允许读和写。  
//             "ab" 追加打开一个二进制文件,并在文件末尾写数据。  
//             "ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。     
//    --返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在error中。

fread–fwrite:


size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
//    -- buffer:指向数据块的指针  
//    -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)  
//    -- count:数据个数  
//    -- stream:文件指针 

fclose:

 int fclose(FILE *fp);

代码实例:

#include <stdio.h>
#include <string.h>

#define WENJIAN "./text.txt"

int main()
{
    FILE *fp = fopen(WENJIAN,"a+");
    if(fp == NULL)
    {
        perror("fopen");
        return -1;
    }
    char buf[128];
    strcpy(buf,"hi,i am a good man!");
    if(fwrite(buf,sizeof(char),strlen(buf),fp) == 0)
    {
        perror("fwrite");
        return -1;
    }
    fclose(fp);


    FILE *filp = fopen(WENJIAN,"r");
    if(filp == NULL)
    {
        perror("fopen");
        return -1;
    }
    char arr[128];
    if(fread(arr,sizeof(char),strlen(buf),filp) == 0)
    {
        perror("fread");
        return -1;
    }
    printf("%s\n",arr);
    fclose(fp);
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值