【C语言】文件操作

文章详细介绍了文件在计算机中的作用,包括数据持久化的概念,以及如何在C语言中进行文件操作。重点讨论了文件指针、文件的打开模式(如读写、追加等)以及文件的顺序读写函数,如fopen、fclose、fputc、fgetc等。此外,还提到了二进制文件的处理和文件结束的判断方法。
摘要由CSDN通过智能技术生成

目录

1.为什么要使用文件

2.什么是文件

2.1文件名

3.文件的打开与关闭

3.1文件指针

3.2文件的打开和关闭

4文件的顺序读写

4.1字符输入函数

 5.文件的随机读写

 6.文件结束的判断


1.为什么要使用文件

在计算机中存储的文本,图片视频之类的,我们希望这些文件能一直留在电脑上,而不是每次关机、开机都要重新下载。

既然想把数据保留下来只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。

使用文件我们就可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2.什么是文件

磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

2.1文件名

每个文件在计算机中都有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.dat

3.文件的打开与关闭

通常我们对文件的操作可以分为3个部分:打开文件,操作文件,关闭文件。

3.1文件指针

在cplusplus.com中可以看到“文件类型指针”,简称“文件指针”

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统 声明的,取名FILE.

 当打开一个文件时,系统会根据文件的情况自动创建一个FILE结构的变量,我们一般是通过这个FILE指针来维护FILE结构变量。

我们创建一个文件指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。我们可以通过文件指针变量能够找到与它关联 的文件,对文件进行编辑。

3.2文件的打开和关闭

以下为文件的使用方式:

文件使用方式                                 含义                                                         如果指定文件不存在

“r”(只读)                 为了输入数据,打开一个已经存在的文本文件                    出错

“w”(只写)                 为了输出数据,打开一个文本文件                                  建立一个新的文件

“a”(追加)                 向文本文件尾添加数据                                                     建立一个新的文件

“rb”(只读)                 为了输入数据,打开一个二进制文件                                 出错 

”wb”(只写)                 为了输出数据,打开一个二进制文件                            建立一个新的文件

“ab”(追加)                 向一个二进制文件尾添加数据                                            出错

“r+”(读写)                 为了读和写,打开一个文本文件                                         出错

“w+”(读写)               为了读和写,建议一个新的文件                                   建立一个新的文件

“a+”(读写)                打开一个文件,在文件尾进行读写                                建立一个新的文件

“rb+”(读写)               为了读和写打开一个二进制文件                                         出错

“wb+”(读写)         为了读和写,新建一个新的二进制文件                           建立一个新的文件

“ab+”(读写)         打开一个二进制文件,在文件尾进行读和写                     建立一个新的文件

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

 

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

举个例子:

#include <stdio.h>
int main ()
{
  FILE* pf;
  //打开文件
  pf = fopen("text.txt", "w");
  //文件操作
  if (pf != NULL)
  {
   fputs("fopen example", pf);
   //关闭文件
   fclose(pf);
  }
  return 0;
}

4文件的顺序读写

4.1字符输入函数

fputc:将一个字符写入文件中

正常返回:要写入字符的代码

异常返回:EOF

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{

        FILE* pf;
        //打开文件
        pf = fopen("text.txt", "w");
        //文件操作
        if (pf == NULL)
        {
            perror("fopen");
        }
        //写入文件
        fputc('a', pf);
        fputc('b', pf);
       /* int ch=fgetc(pf);
        printf("%c", ch);*/
        //关闭文件
        fclose(pf);
        return 0;
    

}

 fgetc:从文件中读取一个字符

正常返回:读取到的字符

异常返回:返回EOF

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{

        FILE* pf;
        //打开文件
        pf = fopen("text.txt", "r");
        //文件操作
        if (pf == NULL)
        {
            perror("fopen");
        }
        /*fputc('a', pf);
        fputc('b', pf);*/
        //读取文件中的一个字符并输出
        int ch=fgetc(pf);
        printf("%c", ch);
        //关闭文件
        fclose(pf);
        return 0;
    

}

fputs:将字符串写入到文件中,传入要写入的字符串与stream文件流

正常返回:一个非负值

异常返回:EOF

 fgets:从文件中读取(num-1)个字符,并把读取出来的字符存到str指向的空间中,最后在字符后加上‘\0’

正常返回:str的值

异常返回:NULL,可以用feof()和ferror()来判断是因为读取到字符串尾部结束的,还是出现了异常

 

 fprintf:格式化输出函数,将数据按照format格式输出,使用方法与printf差不多

printf是把内容输出到输入流(stdio)中,fprintf适用于所以流,只需要在printf函数参数的基础上加上文件流就可以把内容按照格式写入到文件中。

正常返回:返回写入的字符总数。

异常返回:如果发生写入错误,则设置ferror()并返回负数。
如果在写入宽字符时发生多字节字符编码错误,errno 将设置为 EILSEQ 并返回负数。

 

 fscanf:格式化输入函数,使用方法也和scanf差不多

正常返回:成功填充的参数列表的项数。
异常返回:如果发生读取错误或在读取时到达文件末尾,则会设置feof() 或 ferror()并且,如果在成功读取任何数据之前发生任一情况,则返回 EOF。如果在写入宽字符时发生多字节字符编码错误,errno 将设置为 EILSEQ 并返回负数。

 

fwrite:以二进制的形式写入数据

ptr:指向要写入的元素数组的指针,转换为 const void*。

size:要写入的每个元素的大小(以字节为单位)

count:元素数,每个元素的大小为字节大小

stream:指向指定输出流的 FILE 对象的指针。

正常返回:返回成功写入的元素总数。

异常返回:如果此数字与 count 参数不同,则写入错误阻止函数完成。在这种情况下,将为设置错误指示器ferror)。
如果大小计数为零,则该函数返回零,错误指示器保持不变。

 

fread:以二进制的形式读取数据

ptr:指向要写入的元素数组的指针,转换为 const void*。

size:要写入的每个元素的大小(以字节为单位)

count:元素数,每个元素的大小为字节大小

stream:指向指定输出流的 FILE 对象的指针。

正常返回:返回成功读取的元素总数。
异常返回:如果此数字与 count 参数不同,则表示读取时发生读取错误或到达文件末尾。在这两种情况下,都会设置正确的指标,可以分别用 ferror 和 feof 进行检查。
如果大小计数为零,则该函数返回零,并且流状态和 ptr 指向的内容保持不变。

 5.文件的随机读写

stream:指向标识流的 FILE 对象的指针。

offset:二进制文件:要从偏移的字节数。
                文本文件:零或 ftell 返回的值。

origin:用作偏移参考的位置。它由 <cstdio> 中定义的以下常量之一指定,专门用作此函数的参数:

ConstantReference position
SEEK_SET文件开头
SEEK_CUR文件指针当前的位置
SEEK_END文件指针结尾

正常返回:该函数将返回零。
异常返回:它将返回非零值。
如果发生读取或写入错误,则设置错误指示器ferror)。

例如:

 先向文件写入This is an apple.

然后从文件开头往后找9个字符从n开始,用 “ sam”把后面四个字符修改掉

 ftell:传入文件流,返回文件指针在当前流中指向的位置。

正常返回:返回文件指针的位置。

异常返回:返回-1L,并将errno设置为特定于系统的正值。

rewind 函数

void rewind ( FILE * stream );

让文件指针回到起始位位置

 6.文件结束的判断

应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

正常返回:文件读取完,遇到了文件结束指示符,则返回非零值。

异常返回:返回零。

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如: fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL .

2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如: fread判断返回值是否小于实际要读的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值