c语言文件类型指针
我们在定义文件类型指针变量后,称作该指针指向该文件,但本质上,它不是指向一个存储文件信息的结构型变量么?
那么我们在用各个函数对所谓的“文件指针”进行操作时,本质上是不是函数通过获取文件指针所指向的文件信息内部的数据,才进行真正意义上的文件操作的吧?
比方说读写时候的文件内部的那个一位一位移动的指针其实是结构型变量里的一个成员吧?
c语言文件类型指针是通过FILE *fp; 这种形式进行定义的。
关于FILE结构在VC6中有如下定义:
C程序用不同的FILE结构管理每个文件。程序员可以使用文件,但是不需要知道FILE结构的细节。实际上,FILE结构是间接地操作系统的文件控制块(FCB)来实现对文件的操作的,如下图:
上面图中的_file实际上是一个描述符,作为进入打开文件表索引的整数。
文件是存放在物理磁盘上的,包括文件控制块(FCB)和数据块。文件控制块通常包括文件权限、日期(创建、读取、修改)、拥有者、文件大小、数据块信息。数据块用来存储实际的内容。当打开一个文件时,程序会将物理磁盘上的文件数据块读入到内存,然后通过文件指针的移动读取内存中的文件数据。
相关函数:
FILE *fopen( char *file, char *open_mode ); //打开文件,读文件到内存,返回文件信息结构指针
int fread( char s, int size, int num, FILE *fp ); //按字节读取文件内容到s中
int fwrite( char s, int size, int num, FILE *fp ); //按字节将s地址中的数据写到文件中
char *fgets( char *s, int max_size, FILE *fp); //读一行数据到缓冲区s中
int fseek( FILE *fp, long offset, int whence); //移动文件指针到指定位置
void rewind(FILE *fp); //回到文件头
long ftell(FILE *fp); //得到当前文件偏移位置
fclose(fp); //关闭文件,刷新缓存到物理磁盘上
FILE 类型是一个结构,
文件打开成功时,对它作了内存分配和初始化。
文件读写和文件操作有许多程序,除数据读写和转换外还有许多操作,读写和操作既用到FILE结构里的内容,同时也修改和更新与文件有关的信息。
例如fseek,ftell,fgetpos,fsetpos,rewind,这些虽不是读写,但它们操作文件。
文件指针是FILE的一个成员。
问题:
FILE *fpt = fopen("a.txt","r");
为什么不能puts(fpt);将a.txt里面的内容打印出来?
只能通过fscanf转换一下
文件指针
只能用文件的读写操作函数
FILE是一个结构体指针,里面包括文件名啊,文件缓冲区啊什么的,研究标准库可以通过FILE结构得到文件里的内容。
FILE是一个在stdio.h中预先定义的一个文件类型。
要先声名一个文件指针变量然后用文件函数操作。
在书上看到过一个FILE类型
typedef struct{
short level;/*缓冲区“满/空”的程度*/
unsigned flags;/*文件状态标志字*/
char fd;
unsigned char hold;
short bsize;/*缓冲区大小*/
unsigned char *buffer;/*数据缓冲区的位置*/
unsigned char *curp;/*当前读写位置指针*/
unsigned istemp;
short token;
}FILE;
for linux
总而言之、言而总之,不管是win还是linux,FILE *里面存放的都是open打开的原始fd和一些文件信息,譬如当前文件偏移、文件大小、读写状态等等。。。。
//from stdio.h
typedef struct_IO_FILE FILE;//from libio.h
struct_IO_FILE {int _flags; /*High-order word is _IO_MAGIC; rest is flags.*/
#define _IO_file_flags _flags
/*The following pointers correspond to the C++ streambuf protocol.*/
/*Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly.*/
char* _IO_read_ptr; /*Current read pointer*/
char* _IO_read_end; /*End of get area.*/
char* _IO_read_base; /*Start of putback+get area.*/
char* _IO_write_base; /*Start of put area.*/
char* _IO_write_ptr; /*Current put pointer.*/
char* _IO_write_end; /*End of put area.*/
char* _IO_buf_base; /*Start of reserve area.*/
char* _IO_buf_end; /*End of reserve area.*/
/*The following fields are used to support backing up and undo.*/
char *_IO_save_base; /*Pointer to start of non-current get area.*/
char *_IO_backup_base; /*Pointer to first valid character of backup area*/
char *_IO_save_end; /*Pointer to end of non-current get area.*/
struct _IO_marker *_markers;struct _IO_FILE *_chain;int_fileno;#if 0
int_blksize;#else
int_flags2;#endif_IO_off_t _old_offset;/*This used to be _offset but it's too small.*/
#define __HAVE_COLUMN /* temporary */
/*1+column number of pbase(); 0 is unknown.*/unsignedshort_cur_column;
signedchar_vtable_offset;char _shortbuf[1];/*char* _save_gptr; char* _save_egptr;*/_IO_lock_t*_lock;
#ifdef _IO_USE_OLD_IO_FILE
};