1.什么是文件

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

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件。

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt

2.文件指针

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

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联 的文件。

3.文件的打开方式

文件使用方式

含义

如果指定文件不存在

“r”(只读)

为了输入数据,打开一个已经存在的文本文件

出错

“w”(只写)

为了输出数据,打开一个文本文件

建立一个新的文件

“a”(追加)

向文本文件尾添加数据

建立一个新的文件

“rb”(只读)

为了输入数据,打开一个二进制文件

出错

“wb”(只写)

为了输出数据,打开一个二进制文件

建立一个新的文件

“ab”(追加)

向一个二进制文件尾添加数据

出错

“r+”(读写)

为了读和写,打开一个文本文件

出错

“w+”(读写)

为了读和写,建议一个新的文件

建立一个新的文件

“a+”(读写)

打开一个文件,在文件尾进行读写

建立一个新的文件

“rb+”(读写)

为了读和写打开一个二进制文件

出错

“wb+”(读写)

为了读和写,新建一个新的二进制文件

建立一个新的文件

“ab+”(读写)

打开一个二进制文件,在文件尾进行读和写

建立一个新的文件

例子:

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

打开指定文件的方法

int main()
{fopen("test.txt", "r");//打开当前文件夹下的test.txt文件fopen("../test.txt", "r");//打开上一文件夹的test.txt文件fopen("D:\\study\\CPP\\code\\test\\test_6\\test.txt", "r");//打开指定文件夹的test.txt文件return 0;
}

4.文件的顺序读写

功能

函数名

适用于

声明

字符输入函数

fgetc

所有输入流

int fget(FILE* stream)

字符输出函数

fputc

所有输出流

int fputc(int c, FILE* stream)

文本行输入函数

fgets

所有输入流

char* fgets(char* string, int max_n ,FILE* stream)

文本行输出函数

fputs

所有输出流

int fputs(char* string, FILE* stream)

格式化输入函数

fscanf

所有输入流

int fscanf(FILE* stream, const char* format, ...)

格式化输出函数

fprintf

所有输出流

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

二进制输入

fread

文件

size_t fread(void* buffer, size_t size, size_t count, FILE* stream)

二进制输出

fwrite

文件

size_t fwrite(void *buffer, size_t size, size_t count, FILE* stream)

问题1:

使用fgets向文件中获取字符串,而此时文件只有一个回车字符,那么请问最终arr中存储了那些数据,假设arr空间足够。

答案:arr为"\n\0";

问题2:

使用gets(arr)获取字符串,此时在键盘上打一个回车符,最终arr中存储了哪些数据,假设arr空间足够。

答案:arr为"\0";

5.文件的随机读写

fseek

声明

int fseek(FILE* stream, long offset, int origin);origin的值:SEEK_CUR
Current position of file pointerSEEK_END
End of fileSEEK_SET
Beginning of file

放回值:

若成功返回0,不成功放回非0。

例子:

int main()
{FILE* pof = fopen("test.txt", "w");char arr[10] = "abc";fputs(arr, pof);fclose(pof);FILE* pif = fopen("test.txt", "r");assert(pif);printf("%c", fgetc(pif));printf("%c", fgetc(pif));printf("%c", fgetc(pif));fseek(pif, 1, SEEK_SET);printf("%c", fgetc(pif));printf("%c", fgetc(pif));fclose(pif);return 0;
}
//答案:abcbc

ftell

声明

long ftell(FILE* stream);

返回

返回当前文件相对于起始位置的偏移量,若失败返回EOF;

rewind

回到起始位置

声明

void rewind(FILE* stream);

6.文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文 本文件。 一个数据在内存中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

7.文件读取结束的判定

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

例子

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin","rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code == SIZE) {puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');} else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

8.文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

例子:

include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
int main()
{FILE*pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭文件的时候,也会刷新缓冲区pf = NULL;return 0;
}

这里可以得出一个结论:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。

c语言文件文件操作详解相关推荐

  1. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  2. java对文件的操作详解_Java 对 Properties 文件的操作详解及简单实例

    Java 对 Properties 文件的操作详解及简单实例 发布于 2020-8-7| 复制链接 摘记: Java 对 Properties 文件的操作简介在 Java 中,我们常用 java.ut ...

  3. Python 文件 IO 操作详解

    Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...

  4. C语言文件读写操作详解

    C语言/C++中文帮助文档免积分下载(点击跳转) 当文件按指定的工作方式打开以后,就可以执行对文件的读和写.下面按文件的性质分类进行操作.针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读 ...

  5. IOS 文件读写操作详解及简单实例

    iPhone 文件读写操作 1,写文件操作 - (IBAction)btnWrite:(id)sender {//创建文件管理器NSFileManager *fileManager = [NSFile ...

  6. 【Python从零到壹】Python文件的操作详解

    文章目录 1. 文件的读写原理: 2. 常用的文件打开模式 3. 文件对象的常用方法 4. 目录的相关操作 1. 文件的读写原理: 文件的读写称为I/O操作. 操作原理: .py文件是用解释器去运行, ...

  7. AutoCAD Map 3D对ArcGIS shp文件的操作详解!

    在之前的一篇推文中,介绍了用AutoCAD Map 3D将多段线转换为shp格式线或面文件,实际上,AutoCAD Map 3D作为CAD和GIS的桥梁,它对GIS数据格式的操作远不止这些. 例如:A ...

  8. Python基础必掌握的文件读写操作详解

    读取和写入文件等操作是 Python 可以完成的最常见任务之一.无论是写入简单的文本文件,读取复杂的服务器日志,甚至分析原始字节数据,进行相关的处理操作,最终所有这些情况都需要读取或写入文件. 整套学 ...

  9. python怎么读write_Python如何读写文件?python写入文件读写操作详解

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  10. java对文件的操作详解,java对各种文件的操作详解

    java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //String URL = request.getRequestURI() ...

最新文章

  1. python找出值为nan_Python Numpy:找到list中的np.nan值方法
  2. CentOS 7.4下Redis及集群的安装及配置
  3. tableau实战系列(四)用条形图或环形图来呈现进度百分比
  4. # POJ-1979(BFS)
  5. 在苏州的一个超级棒的事情
  6. 2021年,Java开发者值得学习的13项技能
  7. 1补码 2补码_8085微处理器中8位数字的1和2的补码
  8. 渣本毕业两年经验,看这一篇就够了!
  9. WCF分布式开发步步为赢(14):WCF安全编程--基本概念
  10. 用 RSocket 解决响应式服务之间的通讯
  11. idc机房运维巡检_技本功|数据安全之IDC数据容灾设计实现
  12. 00_51入门知识积累__焊接器件
  13. JAVA 经纬度转换成直角坐标系,以及直角坐标系转换成经纬度算法
  14. 计算机打印怎么取消,打印机如何取消打印作业?如何删除打印作业?
  15. css如何去掉图片里面存在的背景色
  16. 图片png怎么转成pdf格式?
  17. 异地多活高可用架构设计实践与思考
  18. 详细分析stm32f10x.h
  19. 什么是GPU?跟CPU有什么区别?终于有人讲明白了
  20. java long 空_long类型判断是否为空

热门文章

  1. C语言中%s,%m.ns 和 %e,%m.ne 的意思
  2. 修复OutLook2007 pst 文件
  3. 鸿蒙系统小白,站在小白用户的立场上看待华为的鸿蒙系统
  4. Python request如何做接口测试
  5. Hbase的安装与shell操作介绍
  6. Mysql定时任务,最简单例子
  7. TAElectronic-车辆电子电器模型库
  8. [JavaScript]如何将www.xxx.com变为com.xxx.www
  9. MATLAB 数据处理(二)非线性拟合——洛伦兹拟合(Lorentz fit)
  10. CT图像的三维表面重建