当前位置: 首页 > news >正文

C-文件操作

C-文件操作

  • 1.什么是文件?
    • 1.1 程序文件
    • 1.2 数据文件
    • 1.3 文件名
  • 2. 二进制文件和文本文件
  • 3.文件的打开和关闭
    • 3.1 流和标准流
      • 3.1.1 流
      • 3.1.2 标准流
    • 3.2 文件指针
    • 3.3 文件的打开和关闭
  • 4. 文件的顺序读写
    • 4.1 顺序读写函数介绍
      • 4.1.1 字符读写函数
      • 4.1.2 字符串读写函数
      • 4.1.3 格式化读写函数
  • 5 文件的随机读写
    • 5.1 fseek
    • 5.2 ftell
    • 5.3 rewind
  • 6 文件读取结束的判定
    • 6.1 被错误使用的feof

1.什么是文件?

文件 是计算机中存储数据的基本单位,是存储在辅助存储器(如硬盘、U盘、光盘等)上的一组相关数据的集合。
一般有两种文件:程序文件、数据文件(从文件功能的角度来分类的)

1.1 程序文件

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

1.2 数据文件

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

1.3 文件名

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

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

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

3.文件的打开和关闭

3.1 流和标准流

3.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等数据输入输出操作都是通过流操作的。

一般情况下,我们要向流里写数据,或者从流中读数据,都是要打开流,然后操作。

3.1.2 标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

因为C语言程序在启动的时候,默认打开了3个流:
· stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
· stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。
· stderr - 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
上述三个流的类型是:FILE*,通常称为文件指针

3.2 文件指针

缓冲文件系统中,关键概念是“文件类型指针”,简称“文件指针”。

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

不同的编译器的FILE类型包含的内容不完全相同,但是基本一样。

每当打开一个文件的时候,系统就会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关系细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

创建一个FILE* 的指针变量:

FILE* pf;

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

3.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

使用fopen函数打开文件,fclose函数关闭文件。

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

mode 表示文件的打开模式,下面是文件的打开模式:
在这里插入图片描述

int main()
{FILE* pFile;//打开文件pFile = fopen("file.txt", "w");//文件操作if (pFile != NULL){//将内容写入到file.txt文件中fputs("fopen wxample", pFile);//关闭文件fclose(pFile);}return 0;
}

4. 文件的顺序读写

4.1 顺序读写函数介绍

在C语言中,顺序读写函数是指按照文件中数据的存储顺序依次进行读写操作的函数。这些函数通常用于文本文件或二进制文件的逐字符、逐行或按格式的读写。
在这里插入图片描述

4.1.1 字符读写函数

1、fgetc(FILE* stream) 功能:从文件中读取一个字符
返回值:

  • 成功:返回读取的字符
  • 失败或文件结束:返回EOF(通常为-1)
int main()
{FILE* fp = fopen("test.txt", "r");if (fp == NULL){perror("文件打开或失败");return -1;}int ch;while ((ch = fgetc(fp)) != EOF) {putchar(ch);//输出到屏幕}fclose(fp);
}

2、fputc(int char,FILE* stream) 功能:向文件流中写入一个字符
返回值:

  • 成功:返回写入的字符
  • 失败:返回EOF。
int main()
{FILE* fp = fopen("output.txt", "w");if (fp == NULL) {perror("文件打开失败");return -1;}fputc('A', fp);//写入到文件中Afputc('\n', fp);//写入到文件中\nfclose(fp);
}

4.1.2 字符串读写函数

1、fgets(char *str, int n, FILE *stream) 功能:从文件流中读取一行字符串(最多n-1个字符,或直到遇到‘\n’)。
返回值:

  • 成功:返回str(读取的字符串)
  • 失败或文件结束:返回NULL
int main()
{FILE* fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打开失败");return 1;}char buffer[100];while (fgets(buffer, sizeof(buffer), fp) != NULL) {  // 逐行读取printf("%s", buffer);  // 输出到屏幕}fclose(fp);
}

2、fputs(const char *str, FILE *stream) 功能:向文件流中写入一个字符串(不自动添加换行符)
返回值:

  • 成功:返回非复值
  • 失败:返回EOF
int main()
{FILE* fp = fopen("output.txt", "w");if (fp == NULL) {perror("文件打开失败");return 1;}fputs("Hello, World!\n", fp);  // 写入字符串fputs("This is a test.\n", fp);fclose(fp);
}

在这里插入图片描述

4.1.3 格式化读写函数

1、fscanf(FILE *stream, const char *format, ...) 功能:从文件流中按格式读取数据(类似scanf())
返回值:

  • 成功:返回成功匹配和赋值的输入项数
  • 失败或文件结束:返回EOF
int main()
{FILE* fp = fopen("data.txt", "r");if (fp == NULL) {perror("文件打开失败");return 1;}int num;char str[50];while (fscanf(fp, "%d %s", &num, str) != EOF) {  // 按格式读取printf("读取的数字: %d, 字符串: %s\n", num, str);}fclose(fp);
}

2、fprintf(FILE *stream, const char *format, ...) 功能:向文件流中按格式写入数据(类似printf())。
返回值:

  • 返回写入的字符数
  • 失败:返回负值
int main()
{FILE* fp = fopen("output.txt", "w");if (fp == NULL) {perror("文件打开失败");return 1;}int num = 42;char* str = "C Programming";fprintf(fp, "%d %s\n", num, str);  // 按格式写入fclose(fp);
}

在这里插入图片描述
在这里插入图片描述

5 文件的随机读写

5.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

int fseek(FILE* stream,long int offset,int origin);
int main()
{FILE* pFile;pFile = fopen("example.txt", "wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs("sam", pFile);fclose(pFile);return 0;
}

5.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell(FILE* stream);
int main()
{FILE* pFile;long size;pFile = fopen("myfile.txt", "rb");if (pFile == NULL)perror("Error opening file");else{fseek(pFile, 0, SEEK_END);   // non-portablesize = ftell(pFile);fclose(pFile);printf("Size of myfile.txt: %ld bytes.\n", size);}return 0;
}

5.3 rewind

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

void rewind(FILE* stream);
int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("myfile.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);rewind(pFile);fread(buffer, 1, 26, pFile);fclose(pFile);buffer[26] = '\0';printf(buffer);return 0;
}

6 文件读取结束的判定

6.1 被错误使用的feof

在文件读取过程中,不能使用feof函数的返回值直接来判断文件是否结束

feof的作用:当文件读取结束的时候,判断是读取结束还是遇到文件尾结束。

1、文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
2、二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

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

http://www.dtcms.com/a/533649.html

相关文章:

  • 【第一章】基于Simulink的控制器开发教程——目录
  • 重庆个人网站建设单页网站制作视频教程
  • Dubbo 消费者是如何与 Spring 融合的?
  • 徐州发布网站怎样临沂网站建设
  • 怎么免费做一个网站盛世阳光-网站建设
  • Nav2 Lifecycle Manager:生命周期管理器的设计哲学与源码级运行机制
  • 云服务器上安装Tomcat
  • 高端网站建设 n磐石网络广州市增城区住房和建设局网站
  • 东莞网络营销新模式如何做好seo优化
  • 建设银行网站的安全措施wordpress加密
  • 北京网站报价网站开发语言格式化标记语言
  • Linux中内核从用户空间获取路径名getname函数的实现
  • 台州网站建设企业精品网站建设教程
  • 触屏版网站模板怎么把网站变成免费的
  • 手机网站建设事项京东商城网上购物商城
  • 卖鞋的网站建设思路河北建设部网站
  • 广州网站建设求职简历wordpress加联系方式
  • 迟到的加入CSDN周年纪念
  • 惠州网站建设多少钱闸北网站建设
  • FFmpeg 基本数据结构 AVInputFormat 分析
  • 在哪个网站做视频好赚钱做企业公司网站
  • 基于docker打包code server镜像的范例(2025/10/26更新)
  • 邻接矩阵的 k 次幂意味着什么?从图论到路径计数的直观解释
  • 海兴县做网站价格wordpress后台超慢
  • 实战案例:某电商网站反爬策略分析与绕过过程记录
  • 网站开发有哪些内容中国建设教育协会是个什么网站
  • 昆明市建设局网站台州建设监理协会网站
  • 《Linux篇》命令行参数与环境变量
  • vue做的网站wordpress存档
  • 建设银行网站无法登陆网站服务器怎么选