文件有关的函数

本文详细介绍了C语言中文件操作的关键函数如fopen、fclose、fgetc/fputc、fgets/fputs以及fread/fwrite,包括随机读写和文件定位的方法,如rewind、fseek和ftell,以及如何处理未知大小文件的完整读取和内存管理。
摘要由CSDN通过智能技术生成

一、打开文件fopen

函数的声明:
FILE *fopen(const char *path, const char *mode);
函数说明:fopen 函数的功能是打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标识。

函数的参数:
        参数 1:打开的文件的路径
        1.绝对路径,从根目录开始的路径名称
        “D:\\demo\\test\\aaa.txt”
        2.相对路径
        .\\test\\aaa.txt
        参数 2:文件打开的方式,即以什么样的方式(只读、只写、可读可写等等)打开文件       第二个参数的几种形式(打开文件的方式)
        读写权限:r      w      a      +      

r:以只读方式打开文件
        文件不存在返回 NULL
        文件存在,且打开文件成功,返回文件指针,进行后续的读操作
        1
        FILE *fp
        fp=fopen(“test.txt”,”r”);

w:以只写方式打开文件
   1、文件不存在,以指定文件名创建此文件,并且打开文件; 2、若文件存在,清空文件内容,打开文件,然后进行写操作;    3、如果文件打不开(比如文件只读),返回 NULL
   FILE *fp
   fp=fopen(“test.txt”,”w”);

a:以追加方式打开文件
       1、文件不存在,以指定文件名创建此文件( w)
       2、若文件存在,从文件的结尾处进行写操作
说明:
       如果不加 a 的话,打开文件的时候读写位置在文件的开始,对文件进行读写的时候都是从文件开始进行读写的。

如果加 a,打开已经存在的文件,读写位置在文件的末尾。

+:同时以读写打开指定文件

模式功能
r 或 rb以只读方式打开一个文本文件
w 或 wb以写方式打开文件(使文件长度截断为0字节,创建一个文件)
a 或  ab以追加方式打开文件,即在末尾添加内容,当文件不存在时,创建文件于写
r+ 或 rb+以可读、可写的方式打开文件(不创建新文件)
w+ 或 wb+以可读、可写的方式打开文件(使文件长度为0字节,创建一个字节)
a+ 或 ab+以追加方式打开文件,打开文件并在末尾更改文件(如果文件不存在,则创建文件)

返回值:
        成功:打开的文件对应的文件指针
        失败:返回 NULL
以后调用 fopen 函数的时候,一定要判断一下,打开是否成功。

二、关闭文件fclose

函数的头文件:
#include <stdio.h>
函数的声明:
  int fclose(FILE *fp);
函数的说明:
  关闭 fp 所代表的文件
注意一个文件只能关闭一次,不能多次关闭。关闭文件之后就不能再文件指针对文件进行读写等操作了。

返回值
        成功返回 0
        失败返回非 0
可以通过返回值,来判断关闭文件是否成功。

栗子:

三、一次读写一个字符

函数声明:
int fgetc(FILE *stream);
函数说明:
       fgetc stream 所标识的文件中读取一个字节,将字节值返回
返回值:
       t 的方式:    读到文件结尾返回 EOF
       b 的方式:读到文件结尾,使用 feof(文件指针)判断结尾
       feof C 语言标准库函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非 0 值,否则返回 0(即,文件结束:返回非 0 值;文件未结束:返回 0 值)。

函数的声明:
int fputc(int c, FILE *stream)
函数的说明
        fputc c 的值写到 stream 所代表的文件中。

返回值
如果输出成功,则返回输出的字节值;
如果输出失败,则返回一个 EOF

EOF 是在 stdio.h 文件中定义的符号常量,值为-1

注意:打开文件的时候,默认读写位置在文件的开始,如果以 a 的方式打开读写位置在文件的末尾 咱们向文件中读取字节或写入字节的时候,读写位置会往文件的末尾方向偏移,读写多少个字节,读写位置就往文件的末尾方向偏移多少个字节.

栗子:

四、一次读写一个字符串

char *fgets(char *s, int size, FILE *stream);
stream 所代表的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了 size-1 个字节停止读取,在读取的内容后面会加一个\0,作为字符串的结尾

返回值:
成功返回目的数组的首地址,即 s
失败返回 NULL

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

函数功能:
        s 指向的字符串,写到 stream 所代表的文件中 返回值:

成功返回写入的字节数
失败返回 -1

栗子:

五、读文件fread

函数的声明:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的说明:
        fread 函数从 stream 所标识的文件中读取数据,每块是 size 个字节,共 nmemb 块,存放到 ptr 指向的 内存里
返回值:
        实际读到的块数。

栗子:
unsigned int num;
num=fread(str,100,3,fp);
fp 所代表的文件中读取内容存放到 str 指向的内存中,读取的字节数为 ,每块 100 个字节,3 块。

返回值 num
如果读到 300 个字节返回值 num 3
如果读到了大于等于 200 个字节小于 300 个字节 返回值为 2 读到的字节数,大于等于 100 个字节小于 200 个字节 返回 1 不到 100 个字节返回 0

六、写文件发fwrite

函数的声明:
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的说明:
        fwrite 函数将 ptr 指向的内存里的数据,向 stream 所标识的文件中写入数据,每块是 size 个字节,共 nmemb 块。

返回值:
实际写入的块数

栗子:

注意:

fwrite 函数是将内存中的数据原样输出到文件中。

fread 函数是将文件中的数据原样读取到内存里。

七、随机读写

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;

但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第 200--300 个字节

为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写实现随机读写的关键是要按要求移动位置指针,这称为文件的定位.

完成文件定位的函数有:

rewindfseek 函数

1 rewind 复位读写位置

rewind 函数

void rewind(文件指针);

函数功能:   把文件内部的位置指针移到文件首

调用形式:rewind(文件指针);

栗子:

2 ftell 测文件读写位置距文件开始有多少个字节

定义函数:long ftell(文件指针);
函数功能:取得文件流目前的读写位置.

返回值:返回当前读写位置(距离文件起始的字节数),出错时返回-1.

栗子:long int length ;

           length = ftell(fp);

3、 fseek 定位位置指针(读写位置)
fseek 函数(一般用于二进制文件即打开文件的方式需要带 b  函数声明:
      int fseek(FILE *stream, long offset, int whence);
      //int fseek(文件类型指针,位移量,起始点);
      函数功能:
      移动文件流的读写位置.

参数:
whence 起始位置

     文件开头

SEEK_SET

0

文件当前位置

SEEK_CUR

1

    文件末尾

SEEK_END

2

位移量:
        以起始点为基点,向前、后移动的字节数,正数往文件末尾方向偏移,负数往文件开头方向

偏移。

栗子:

练习:
                 将一个未知大小的文件(文本文件)全部读入内存,并显示在屏幕上

参考:fseek

ftell

rewind

fread

malloc

1、 打开文件 fopen ,注意用 b 的方式打开
2、 定位文件的读写位置到文件的末尾 fseek
3、 测文件的字节数 len          ftell
4、 复位读写位置到文件的开始 rewind
5、 根据第 3 步得到的字节数,申请内存 malloc 注意多申请一个字节存放’\0’6、 从文件中读取内容,存到申请的空间里 fread
7、 最后一个字节变成 ‘\0
8、 打印读出来的内容到屏幕上 ,printf
9、 关闭文件 fclose
10、释放内存 free

  • 31
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值