咱們在定義文件類型指針變量後,稱做該指針指向該文件,但本質上,它不是指向一個存儲文件信息的結構型變量麼?
那麼咱們在用各個函數對所謂的「文件指針」進行操做時,本質上是否是函數經過獲取文件指針所指向的文件信息內部的數據,才進行真正意義上的文件操做的吧?
比方說讀寫時候的文件內部的那個一位一位移動的指針實際上是結構型變量裏的一個成員吧?html
c語言文件類型指針_百度知道 https://zhidao.baidu.com/question/515085768.htmllinux
c語言文件類型指針是經過FILE *fp; 這種形式進行定義的。程序員
關於FILE結構在VC6中有以下定義:緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#ifndef _FILE_DEFINED
struct
_iobuf {
char
*_ptr;
//文件輸入的下一個位置
int
_cnt;
//當前緩衝區的相對位置
char
*_base;
//指基礎位置(便是文件的起始位置)
int
_flag;
//文件標誌
int
_file;
//文件描述符id
int
_charbuf;
//檢查緩衝區情況,若是無緩衝區則不讀取
int
_bufsiz;
//文件緩衝區大小
char
*_tmpfname;
//臨時文件名
};
typedef
struct
_iobuf
FILE
;
#define _FILE_DEFINED
#endif
|
C程序用不一樣的FILE結構管理每一個文件。程序員可使用文件,可是不須要知道FILE結構的細節。實際上,FILE結構是間接地操做系統的文件控制塊(FCB)來實現對文件的操做的,以下圖: 函數
上面圖中的_file其實是一個描述符,做爲進入打開文件表索引的整數。spa
文件是存放在物理磁盤上的,包括文件控制塊(FCB)和數據塊。文件控制塊一般包括文件權限、日期(建立、讀取、修改)、擁有者、文件大小、數據塊信息。數據塊用來存儲實際的內容。當打開一個文件時,程序會將物理磁盤上的文件數據塊讀入到內存,而後經過文件指針的移動讀取內存中的文件數據。操作系統
相關函數:.net
FILE *fopen( char *file, char *open_mode ); //打開文件,讀文件到內存,返回文件信息結構指針3d
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轉換一下