C语言文件笔记

理解

将数据看作水流,数据读入就是打开水流开关,把水倒进计算机,数据输出就是倒出,可能是倒在显示器上(不太准确),也可能是倒在指定文件里面。

掌握文件就是数据的流动以及关于文件的函数的调用(我认为)。

文件分为文本文件(ascll码字符文件,通常说记事本)和二进制文件

缓冲文件系统(大致原理):

c程序  <--(程序操作)-->  (用指针fp实现操作[下面会有])内存缓冲区  <---(操作系统)--->  磁盘

也就是说,程序不是直接作用于磁盘文件的。

再具体说文件

首先先给出一个文件类型指针:

int main(){
    FILE *fp;
    ///
    }

FILE 是C语言定义的一个结构体类型(包含在stdio.h 的头文件中)

所以FILE  *fp 就是定义一个可以对 文件 进行操作的 结构体指针。

文件操作

  1. 定义文件指针
  2. 打开文件
  3. 文件处理
  4. 关闭文件

一 . 定义文件指针     

FILE *fp;

二 . 打开文件  

fp = fopen(“文件名字”,“模式”);

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

fp=fopen("文件名字","模式");
//通常会有
if(fp==NULL){
    perror("fopen");//perror是操作失败的原因的函数
    return 1;
}
//或者
if(fp==NULL){
    printf("File open error!\n");
    exit(0);
}

打开成功返回包含文件信息的缓冲区地址,失败返回NULL。

打开文本文件 :

  • "r" : 只能从文件中读数据,该文件必须先存在,否则打开失败
  • "w" : 只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件(大概意思是刷新这个文件重新写入)
  • "a" : 向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
  • "r+" : 可读/写数据,该文件必须先存在,否则打开失败
  • "w+" : 可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
  • "a+" : 可读/写数据,原来的文件不被删去,位置指针移到文件末尾

只读的话不能对文件进行更改,只能从文件中提取数据出去

打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母b ,以表示以二进制形式打开文件(例如“rb”,“wb”)。

三 . 文件处理(读写)

C语言标准库stdio.h中提供了一系列文件的读写操作函数,常用的函数如下。

顺序读写:


1.字符方式文件读写函数:fgetc()和fputc():

int  fgetc (FILE * stream);

ch = fgetc(fp);  //把文件里面的字符赋给ch,如果操作失败,ch=EOF。

//注意不能使用fp++,这并不是跳到文件中的下一个字符,而是下一个 FILE * 指针。

fputc( ch, fp );

int fputc( int character, FILE * stream);


2.字符串方式文件读写函数:fputs()和fgets():

fputs("hello", pf);

int fputs( const char *str, FILE *stream);

fgets 如下

char * fgets (char * str, int num  FILE * stream );


3.格式化方式文件读写函数:fscanf()和fprintf():

fprintf (fp , "%类型" , 数据);

int fprintf( FILE* stream , const char * format ,...);

fscanf (fp , "%类型" , 数据地址);

int fscanf ( FIEL * stream , const char *format ,...);


4.数据块方式文件读写函数:fread()和fwrite():

我们在向文件输出数据时都是以文本格式输出的,但是fwrite函数可以直接将计算机内存中所存储的二进制数据输出到文件中(此时此文件就是一个二进制文件)

fwrite ( ptr , size , count , stream );

size_t fwrite ( const void *ptr ,size_t size, size_t count , FIEL * strem );

        >ptr:接收指向所要输入数据的指针或地址(也就是读进来的数据的地址)

        >size:接收输出的每个数据的大小(以字节为单位)

        >count:所要输出数据的个数(也就是这种类型的数据输出的个数)

        >stream:接收指向所要输出文件的指针(也就是拿出去的数据的地址)

fread ( ptr ,size , count , stream );

size_t fwrite ( void *ptr ,size_t size, size_t count , FILE * strem );

ptr , size , count , steam   的解释跟以上括号里面的差不多

随机读写

1 . fseek函数(指针偏移):

fseek ( stream , offset , origin );

int fseek ( FILE *stream, long int offset, int origin);

该函数运行成功返回0,否则回非零值

  • >stream:传入将要改变的文件指针(文件流)
  • >offsrt:传入指针所要偏移的偏移量(有时候为正有时候为负)
  • >origin:设置传入的stream指针的起始位置

origin 可传入3种参数:SEEK_SET(从文件的开头开始偏移)、SEEK_CUR(从指针的当前位置开始偏移)、SEEK_END(从文件的结尾开始偏移)

//例如
fseek(stream, 0, SEEK_SET)//将文件指针定位到文件开头
fseek(stream, 10, SEEK_CUR)//将文件指针从当前位置向后移动 10 个字节
fseek(stream, -20, SEEK_END)//将文件指针从文件末尾向前移动 20 个字节

2 . ftell函数( 返回此时文件指针相对于起始位置的偏移量:)

成功后,返回位置指示器的当前值,失败时,返回 -1

ftell(fp);

long int ftell (FILE * stream );

3 . rewind函数(将指针定位到文件起始位置)

void rewind (FILE * stream);

与 fseek (fp , 0 , SEEK_SET)等价

四 . 关闭文件

fclose(fp),如果关闭失败返回EOF。

int feof ( FILE * stream);
//通常会有
if(fclose(fp)!=EOF){
    perroer("fclose");
    retutn 1;
}
//或者
if(fclose(fp)!=EOF){
    printf("Can not close the file!\n);
    exit(0);
}

feof函数

用于判断指针是否到达文件尾,是的话就返回EOF,不是的话就返回 0

参考链接:https://blog.csdn.net/m0_70811813/article/details/127218742

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值