c语言文件类型指针

我们在定义文件类型指针变量后,称作该指针指向该文件,但本质上,它不是指向一个存储文件信息的结构型变量么?
那么我们在用各个函数对所谓的“文件指针”进行操作时,本质上是不是函数通过获取文件指针所指向的文件信息内部的数据,才进行真正意义上的文件操作的吧?
比方说读写时候的文件内部的那个一位一位移动的指针其实是结构型变量里的一个成员吧?

c语言文件类型指针_百度知道 https://zhidao.baidu.com/question/515085768.html

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实际上是一个描述符,作为进入打开文件表索引的整数。

文件是存放在物理磁盘上的,包括文件控制块(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. */
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[]; /* char* _save_gptr; char* _save_egptr; */ _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

FILE *p 是什么类型的指针呢?-CSDN论坛 http://bbs.csdn.net/topics/350214445

C语言中FILE是结构体,文件类型的指针的更多相关文章

  1. C语言中,隐藏结构体的细节

    我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装 ...

  2. c语言中,在结构体中如何将void *转存为具体需要的数据类型

    1. 只需要将该void *类型成员,强制转换为具体的数据类型指针即可.需要注意的是,该强制转换是有风险的,转换时,必须确定void*指向内存实际数据为目标结构体格式,否则可能会出现内存越界访问,从而 ...

  3. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...

  4. 结构体&文件

    1.本章学习内容总结 1.1学习内容总结 什么是结构类型? 结构Structure类型是一种允许程序员把一些数据分量聚合成一个整体的数据类型. 结构和数组的区别? 结构和数组的最大区别是数组中所有元素 ...

  5. C语言博客作业06——结构体&文件

    C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...

  6. Golang 笔记 2 函数、结构体、接口、指针

    一.函数 Go中函数是一等(first-class)类型.我们可以把函数当作值来传递和使用.Go中的函数可以返回多个结果.  函数类型字面量由关键字func.由圆括号包裹声明列表.空格以及可以由圆括号 ...

  7. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  8. 【转】C语言中,为什么字符串可以赋值给字符指针变量

    本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5';p=&a;                     //显然 ...

  9. Linux:file命令显示自定义文件类型

    file 命令可以查看文件类型信息,原理见: 非常Linux-file命令与magic file 修改 /ect/magic 文件后,可用 file 命令显示自定义文件类型信息. man magic ...

随机推荐

  1. C++顺序容器vector、deque、list

    1.容器元素类型 C++中大多数数据类型能够作为容器的元素类型.容器元素类型必须满足一下两个条件:支持赋值和复制操作. 所以没有元素是引用类型的容器,同一时候IO对象和auto_ptr也不能作为容器的 ...

  2. android framework-下载Android系统源代码

    □ apt-get install git-core curl #先下载这两个工具 □ mkdir android-froyo #建立下载目录 □ cd android-froyo #进入下载目录 □ ...

  3. 【转】linux configure报错configure: error: C++ preprocessor “/lib/cpp” fails sanity 的解决办法

    /lib/cpp fails sanity check的解决 在某些软件的时候,运行./configure 会报错,错误提示为: configure: error: C++ preprocessor ...

  4. java+ajax实例

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  5. maven导入外部包pom.xml配置

    <dependency> <groupId>com.hadoop</groupId> <artifactId>hadoop-lzo</artifa ...

  6. 【C++程序员学 python】python 之变量

    既然学过C++,那么就应该知道变量是什么,常量是什么. python 相比于C++,在使用变量之前不用先声明. 而是直接使用,python 会根据你的变量自动识别其类型. 假如a = 123 那么a ...

  7. Android实例-红外线操作(XE10.2+小米5)

    相关资料: http://blog.csdn.net/qq_21752153/article/details/50244717https://developer.xamarin.com/api/typ ...

  8. Linux 完整的修改用户名,用户组的方法记录

    今天将虚拟机内所有的用户都是统一规划自己的名字,方便识别操作,特记录相关修改Linux 用户名以及修改用户组的方法 第一种方式,直接改相关文件: /etc/passwd 如图所示,改为自己想用户名,描 ...

  9. Spring InitializingBean和ApplicationListener<ContextRefreshedEvent>

    事件机制作为一种编程机制,在许多语言中都提供了支持.JAVA语言也不例外,java中的事件机制的参与者有3种角色: 1.event object 2.event source 3.event list ...

  10. win7共享文件夹设置无密码

    首先我们要启用guest账户,右键计算机 2 选择管理 3 选择本地用户和组 4 然后选择用户 5 然后选择Guest右键——属性——把账户已禁用勾掉,就可以了 6 然后点击桌面网络右键——属性 7 ...