在C语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。

打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。
标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。
使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为:

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

filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
**

fopen() 函数的返回值

**
fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。

FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。我们不用关心 FILE 的具体结构,只需要知道它的用法就行。

如果希望接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

FILE *fp = fopen("demo.txt", "r");

表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。

再来看一个例子:

FILE *fp = fopen("D:\\demo.txt","rb+");

表示以二进制方式打开 D 盘下的 demo.txt 文件,允许读和写。
判断文件是否打开成功
打开文件出错时,fopen() 将返回一个空指针,也就是 NULL,我们可以利用这一点来判断文件是否打开成功,请看下面的代码:

FILE *fp;
if( (fp=fopen("D:\\demo.txt","rb") == NULL ){printf("Fail to open file!\n");exit(0);  //退出程序(结束程序)
}

我们通过判断 fopen() 的返回值是否和 NULL 相等来判断是否打开失败:如果 fopen() 的返回值为 NULL,那么 fp 的值也为 NULL,此时 if 的判断条件成立,表示文件打开失败。

以上代码是文件操作的规范写法,读者在打开文件时一定要判断文件是否打开成功,因为一旦打开失败,后续操作就都没法进行了,往往以“结束程序”告终。
fopen() 函数的打开方式
不同的操作需要不同的文件权限。例如,只想读取文件中的数据的话,“只读”权限就够了;既想读取又想写入数据的话,“读写”权限就是必须的了。

另外,文件也有不同的类型,按照数据的存储方式可以分为二进制文件和文本文件,它们的操作细节是不同的。

在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种:
控制读写权限的字符串(必须指明)
打开方式 说明

"r"    以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,
否则打开失败。
"w"   以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;
如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个
新文件)。
"a"   以“追加”方式打开文件。如果文件不存在,那么创建一个新文件
;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的
内容保留)。
"r+"以“读写”方式打开文件。既可以读取也可以写入,也就是随意
更新文件。文件必须存在,否则打开失败。
"w+"以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可
以读取也可以写入,也就是随意更新文件。如果文件不存在,那么
创建一个新文件;如果文件存在,那么清空文件内容(相当于删除
原文件,再创建一个新文件)。
"a+"以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既
可以读取也可以写入,也就是随意更新文件。如果文件不存在,那
么创建一个新文件;如果文件存在,那么将写入的数据追加到文件
的末尾(文件原有的内容保留)。

控制读写方式的字符串(可以不写)
打开方式 说明

"t"    文本文件。如果不写,默认为"t"。
"b"   二进制文件。

调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。

读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如:

将读写方式放在读写权限的尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t"
将读写方式放在读写权限的中间:"rb+"、"wt+"、"ab+"

整体来说,文件打开方式由 r、w、a、t、b、+ 六个字符拼成,各字符的含义是:

r(read):读
w(write):写
a(append):追加
t(text):文本文件
b(binary):二进制文件
+:读和写

关闭文件

文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:

int fclose(FILE *fp);

fp 为文件指针。例如:

fclose(fp);

文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。
实例演示
最后,我们通过一段完整的代码来演示 fopen 函数的用法,这个例子会一行一行地读取文本文件的所有内容:

#include <stdio.h>
#include <stdlib.h>
#define N 100
int main() {FILE *fp;char str[N + 1];//判断文件是否打开失败if ( (fp = fopen("d:\\demo.txt", "rt")) == NULL ) {puts("Fail to open file!");exit(0);}//循环读取文件的每一行数据while( fgets(str, N, fp) != NULL ) {printf("%s", str);}//操作结束后关闭文件fclose(fp);return 0;
}

FILE *fopen相关推荐

  1. FILE fopen,fseek等学习

    一. fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,con ...

  2. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  3. Windows/Linux上使用fopen相关函数读取大文件

    在介绍读取大文件之前,先了解下<cstdint>文件,标准头文件,存放固定宽度整数类型,如int32_t, uint32_t,不管在32位上还是64位上,长度都为4个字节:int64_t, ...

  4. Simple File System

    This is my operating system class design. 1.一段代码及其bug. class Program{static void Main(string[] args) ...

  5. php fopen 中文,php fopen用法是什么

    php fopen用于打开一个文件或URL,其语法是"fopen(filename,mode,include_path,context)",参数filename表示要打开的文件或U ...

  6. linux c open fopen freopen 文件操作函数

    open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系 ...

  7. php file size,PHP filesize() 函数

    filesize 作用:函数返回指定文件的大小 语法:filesize(filename) 参数: filename:必需.规定要检查的文件. 返回值: 返回文件大小的字节数,如果出错返回 FALSE ...

  8. 【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )

    文章目录 I C 函数 fopen 打开文件 II C 函数 fprintf 写出文件 III C 函数 fscanf 读取文件 ( 遇到空格换行结束) IV C 函数 fgets 读取文件 ( 遇到 ...

  9. fopen参数mode详解

    FILE * fopen(const char * path,const char * mode); 参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存 ...

最新文章

  1. 2021-01-05 Halcon初学者知识【7】 最简单的测距问题-点与点测距
  2. 软件测试作业2:在敏捷宣言遵循的12条原则中挑选1条你感兴趣的原则进行风险评估
  3. 逆向工程核心原理学习笔记(十):IA-32寄存器基本讲解
  4. InterlliJ Debug启动:method breakpoints may dramatically show down debugging
  5. js导出excel单元格内换行符代码_前端和excel的那些事
  6. 【技术解决方案】优化FFmpeg探测网络流时间过长的问题
  7. 新疆缺少计算机网络技术吗,新疆阿克苏职业技术学院的计算机网络技术专业好不?...
  8. 在linux中的文件中查找_如何在Linux中查找文件
  9. bug10-graphviz.backend.ExecutableNotFound: failed to execute [‘dot‘, ‘-Tpdf‘, ‘-O‘, ‘Source.gv‘]
  10. 地壳中元素含量排名记忆口诀_地壳中含量最多的元素--氧元素
  11. matlab位图矢量化,matlab图形矢量化解决方案
  12. teechart for java_TeeChart控件Java版
  13. 一些特殊符号%$等等,如何写在xml,TextView中
  14. Pytorch错误:RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 1. Got 6
  15. 2022-2027年中国酒店餐饮行业市场调研及未来发展趋势预测报告
  16. 系统聚类算法并绘制谱系图
  17. MongoDB –更新为大写
  18. 中国空气炸锅行业现状分析及投资效益预测报告2022-2028年版
  19. iPhone 游戏 Dungeon Hunter2 地牢猎手 今日通关
  20. 【JavaScript基础-二维数组】JavaScript修改二维数组的某个元素时,其上下元素也受到影响

热门文章

  1. partition应用
  2. 冯·诺依曼计算机特点及结构示意图
  3. 什么是管理沟通?它和信息沟通有什么异同?
  4. 《随机漫步的傻瓜》---寻找你的投资原则,查理芒格说:当成功概率很高的时刻,下最大的赌注,其余时间按兵不动...
  5. ConcurrentHashMap扩容原理
  6. Linux终端tty设备驱动
  7. Games101 作业5 光线与三角形相交
  8. 项目:信息系统项目管理和开发经验分享
  9. JS 去除数组A中包含数组B中的元素(即:获取A数组中不包含B数组的元素)
  10. Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势