概述
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("%sn",arr);
fclose(fp);
return 0;
}
最后
以上就是健忘蜜蜂为你收集整理的fb与FILE的全部内容,希望文章能够帮你解决fb与FILE所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复