震惊!C语言是这样操作文件的!

文章目录

  • 文件指针概述
  • 文件指针打开模式
  • 文件常用操作函数
    • fprintf()函数
    • fscanf()函数
    • fgets()函数
    • fputc()函数
    • fgetc()函数
    • feek()函数
    • frewind()函数
  • ⽂件缓冲区

文件指针概述

1,在C语言中,文件指针是一个用于在程序中操作文件的特殊类型指针。文件指针用于跟踪文件中的位置,以便在文件中执行读取和写入操作。

2,常见的文件指针类型是FILE,它是C标准库中定义的一种结构类型。通常,我们使用 FILE* 类型的指针来引用一个文件。

文件指针的主要作用是

1,定位文件位置:文件指针跟踪文件中当前的读/写位置。在文件操作期间,指针会根据读写操作的进行而自动移动到相应的位置。

2,进行文件操作:通过文件指针,可以进行文件的读取、写入和定位等操作。

在文件操作中,文件指针的一般流程是

1,使用fopen()函数打开文件时,该函数返回一个指向文件的指针。

2,通过该指针执行读取和写入操作,例如使用fscanf()、fprintf()等函数。

3,最后使用fclose()函数关闭文件,并释放文件指针所占用的资源。

举个例子:

#include <stdio.h>int main() {FILE *filePointer;   //定义指针,命名char data[100];// 打开文件以供写入filePointer = fopen("example.txt", "w");if (filePointer == NULL) {printf("无法打开文件\n");return 1;}// 写入数据到文件fprintf(filePointer, "Hello, World!\n");fprintf(filePointer, "This is a test message.\n");// 关闭文件fclose(filePointer);// 打开文件以供读取filePointer = fopen("example.txt", "r");if (filePointer == NULL) {printf("无法打开文件\n");return 1;}// 从文件读取数据并打印到控制台while (fgets(data, 100, filePointer) != NULL) {printf("%s", data);}// 关闭文件fclose(filePointer);return 0;
}

文件指针打开模式

打开文件:使用fopen()函数打开文件,语法如下:

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

filename参数是要打开的文件名;

mode参数表示打开文件的模式;
常见的模式有

  • “r”:只读模式,文件必须存在;

  • “w”:写入模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a”:追加模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件;

  • “r+”:读写模式,文件必须存在;

  • “w+”:读写模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a+”:读写模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件。

  • 读写文件:使用fprintf()和fscanf()函数进行文件的读写操作。例如,使用fprintf()向文件写入数据:

fprintf(FILE *stream, const char *format, ...);
//使用fscanf()从文件读取数据:
fscanf(FILE *stream, const char *format, ...);
//关闭文件:使用fclose()函数关闭文件,释放资源。
int fclose(FILE *stream);
//关闭文件是一个良好的编程习惯,可以避免资源泄漏问题。

文件常用操作函数

fprintf()函数

1,fprintf()函数是C语言中的一个标准输入输出函数,用于将格式化数据写入到文件中。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要写入的目标文件。

  • format:格式化字符串,类似于printf()中的格式化字符串,指定了要写入的内容的格式。

  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的参数。

类比
fprintf()函数的工作方式与printf()类似,但fprintf()将输出结果写入到指定的文件流中,而不是标准输出设备(如屏幕)。它可以用来向文件中写入各种类型的数据,包括字符串、整数、浮点数等。

使用fprintf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fprintf()来写入数据。

2,需要在结束操作后关闭文件流,以确保数据被正确写入文件。

3,格式化字符串中的格式化规范要与提供的参数类型相匹配,否则可能导致不可预料的结果。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入if (file == NULL) {printf("无法打开文件\n");return 1;}int num = 42;float pi = 3.14159;char str[] = "Hello, World!";// 将数据写入文件fprintf(file, "整数:%d\n", num);fprintf(file, "浮点数:%f\n", pi);fprintf(file, "字符串:%s\n", str);fclose(file); // 关闭文件return 0;
}

fscanf()函数

2,fscanf()函数是C语言中的一个标准输入函数,用于从文件中读取格式化数据。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要读取数据的源文件。
  • format:格式化字符串,类似于scanf()中的格式化字符串,指定了要读取的内容的格式。
  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的指针变量,用于存储读取到的数据。

类比
fscanf()函数的工作方式与scanf()类似,但fscanf()从指定的文件流中读取输入数据,而不是从标准输入设备(如键盘)。它可以用来从文件中读取各种类型的数据,包括整数、浮点数、字符串等。

使用fscanf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fscanf()来读取数据。

2,需要在结束操作后关闭文件流,以确保数据被正确读取。

3,格式化字符串中的格式化规范要与读取的数据类型相匹配,否则可能导致读取错误或未定义行为。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}int num;float pi;char str[50];// 从文件中读取数据fscanf(file, "%d", &num);fscanf(file, "%f", &pi);fscanf(file, "%s", str);printf("整数:%d\n", num);printf("浮点数:%f\n", pi);printf("字符串:%s\n", str);fclose(file); // 关闭文件return 0;
}

fgets()函数

3,fgets()函数是C语言中的一个标准库函数,用于从文件流中读取一行数据。它的原型如下:

char *fgets(char *str, int n, FILE *stream);

参数说明

  • str:指向字符数组的指针,用于存储读取到的字符串数据。
  • n:要读取的最大字符数(包括字符串结尾的空字符)。
  • stream:指向文件流的指针,指定要读取数据的源文件。

结束标志

fgets()函数用于从指定的文件流中读取数据,直到遇到换行符(\n)、文件结束符或者读取了n-1个字符为止。它会将读取到的数据存储在指定的字符数组中,并在读取完整行后添加一个空字符来表示字符串的结束。

使用fgets()函数时需要注意以下几点

1,读取的数据会包含换行符\n,除非达到文件末尾。

2,如果成功读取到数据,则fgets()函数会返回第一个参数str的值,如果到达文件末尾或者发生错误,则返回NULL。

3,如果读取的行数据长度超过n-1个字符,fgets()函数会截断多余的部分并在末尾加上空字符。

4,读取到的数据可能不包含换行符,因为fgets()会读取换行符并将其替换为字符串结束符。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}char buffer[100];// 从文件中读取一行数据while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer); // 输出读取到的行数据}fclose(file); // 关闭文件return 0;
}

fputc()函数

4,fputc()函数是C语言中的标准库函数,用于将一个字符写入到指定的文件流中。它的原型如下:

int fputc(int character, FILE *stream);

参数说明

  • character:要写入的字符,通常是一个ASCII码值。
  • stream:指向文件流的指针,指定要写入数据的目标文件。
  • fputc()函数会将指定的字符写入到指定的文件流中,并返回写入的字符(以无符号字符形式)。如果写入成功,则返回写入的字符;如果发生错误,则返回EOF。

使用fputc()函数时需要注意以下几点

1,fputc()函数向文件写入一个字符,如果文件不存在将会新建,如果文件已存在则会覆盖原有内容。

2,如果想连续写入多个字符,可以通过多次调用fputc()函数来实现。
3,写入字符时,会按照ASCII码值写入到文件中。

4,在写入成功后,文件流的位置会自动向前移动一个字符位置。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入if (file == NULL) {printf("无法打开文件\n");return 1;}char ch = 'A';// 将字符写入文件if (fputc(ch, file) != EOF) {printf("字符'%c'写入成功\n", ch);} else {printf("写入失败\n");}fclose(file); // 关闭文件return 0;
}

fgetc()函数

5,fgetc()函数是C语言中的标准库函数,用于从文件流中读取一个字符。它的原型如下:

int fgetc(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要从中读取数据的源文件。

    fgetc()函数会从指定的文件流中读取一个字符,并返回读取到的字符(以无符号字符形式)。如果读取成功,则返回读取到的字符;如果已到达文件末尾或者发生错误,则返回EOF。

使用fgetc()函数时需要注意以下几点

1,fgetc()函数每次只能读取一个字符,如果想连续读取多个字符,可以通过多次调用fgetc()函数来实现。
2,每次调用fgetc()函数,文件流的位置会自动向后移动一个字符位置。
3,如果文件流已经到达文件末尾(EOF),则fgetc()函数返回EOF。
4,读取的字符是无符号字符,即在0-255的范围内,EOF的值通常为-1。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}int ch;// 从文件中逐个读取字符while ((ch = fgetc(file)) != EOF) {printf("%c", ch); // 输出读取到的字符}fclose(file); // 关闭文件return 0;
}

feek()函数

6,fseek()函数是C语言中用于设置文件位置指针的函数,它允许我们在文件中移动文件位置指针的位置。fseek()函数的原型如下:

int fseek(FILE *stream, long int offset, int origin);

参数说明

  • stream:指向文件流的指针,指定要进行定位的文件。

  • offset:偏移量,指定了从起始点(由origin参数确定)开始的偏移量。

  • origin:指定起始点,可以是SEEK_SET、SEEK_CUR或+ SEEK_END,分别表示从文件开头、当前位置或文件末尾开始计算偏移量。

    fseek()函数用于将文件流的位置指针设置到指定的位置。通过调用该函数,可以在文件中进行随机访问,而不仅仅是按顺序读取或写入数据。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("data.txt", "r"); // 打开文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}// 将文件位置指针移动到文件末尾fseek(file, 0, SEEK_END);// 获取当前文件位置指针的位置(即文件末尾的偏移量)long fileSize = ftell(file);printf("文件大小:%ld 字节\n", fileSize);fclose(file); // 关闭文件return 0;
}

frewind()函数

7,frewind()函数是C语言中用于将文件位置指针重新定位到文件的起始位置的函数。它的原型如下:

void rewind(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要重新定位的文件。

    frewind()函数会将文件位置指针重新设置到文件的起始位置,即相当于调用fseek(stream, 0L, SEEK_SET)来实现。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("data.txt", "r"); // 打开文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}// 将文件位置指针重新设置到文件起始位置rewind(file);// 从文件中读取数据,并进行处理...fclose(file); // 关闭文件return 0;
}

⽂件缓冲区

1,ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。

2,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。

3,如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI程序员崛起:人类的饭碗真的会被抢走吗?

近期&#xff0c;全球首位AI程序员Devin的惊艳亮相&#xff0c;在科技界引起了不小的轰动。AI程序员的出现&#xff0c;让人们不禁开始思考一个问题&#xff1a;这些智能编程助手会不会抢走程序员的饭碗&#xff1f;对此&#xff0c;我认为我们需要保持冷静&#xff0c;理性看待…

检验pandas数据中的空值 (DataFrame, 某列,某具体空格)

构建测试数据 创建一个包含空值的DataFrame data {A: [1, 2, np.nan, 4],B: [5, np.nan, 7, 8],C: [np.nan, 10, 11, 12] } df pd.DataFrame(data) 检测 DataFrame 中是否存在空值 null_values pd.isnull(df)# 打印结果 print(null_values)A B C 0 1.0 5.0 Na…

如何在Java中创建Excel表单控件

前言 在数据填报时&#xff0c;创建Excel表单控件是一项常见的任务&#xff0c;它可以极大地简化数据收集和处理的过程。传统的做法需要在Excel中开启开发工具&#xff0c;并且自己手动添加&#xff0c;如下图&#xff0c;就是一个常见的表单控件。 而在Java中&#xff0c;可…

Linux 设备树: of_property_match_string 的用法与工作原理

前言 当前新版本的 Linux 内核 设备驱动框架&#xff0c;与设备树&#xff08;Device Tree&#xff09;结合密切&#xff0c;整体 设备树的设备驱动框架&#xff0c;比较的庞大&#xff0c;但又非常的经典。 一个个的 设备树解析函数&#xff0c;都是前人【智慧】的结晶&#…

dijkstra算法及模板题

⭐️dijkstra 介绍&#xff08;想看的可以看&#xff09; Dijkstra算法&#xff08; /ˈdaɪkstrəz/ DYKE-str z&#xff09;是一种用于找到加权图中的节点之间的最短路径的算法&#xff0c;该加权图可以表示例如道路网络。它是由计算机科学家Edsger W. Dijkstra于1956年出版…

吴恩达ReinforcementLearning Docker镜像构筑

Reinforcement Learning课程Docker镜像制作 前提从Dockerfile构建可用image最后 前提 参照吴恩达机器学习环境本地化构建wsldockertensorflowcuda的1~3构建了Docker可运行的环境 从Dockerfile构建可用image 下载附件并命名为的Dockerfile 在Dockerfile所在的文件夹下运行 do…

docker的dockerfile

FROM Dockerfile中的第一个指令&#xff0c;也是一个必须的指令。它用于指定构建新镜像时所基于的基础镜像。 FROM <image>:<tag> FROM nginx:1.25.1-alpineRUN 指令在Dockerfile中可以出现多次&#xff0c;并且每个RUN指令都会创建一个新的镜像层。为了减少镜像…

富格林:梳理正规本领远离虚假套路

富格林悉知&#xff0c;黄金投资者在从事黄金交易之前&#xff0c;必须先了解黄金交易的风险。因为投资虽然能给你带来一定的收益&#xff0c;但往往也有亏损的风险。在进场后投资者可通过正规经验指导有效避免因为虚假诱导带来的异常亏损&#xff0c;增加安全做单盈利机会。以…

DC电源模块与其他电源模块有着明显的区别与优势

DC电源模块与其他电源模块有着明显的区别与优势 BOSHIDA DC电源模块&#xff08;Direct Current Power Supply Module&#xff09;是一种将交流电转换为直流电的设备&#xff0c;常用于电子设备和工业控制系统中。与其他电源模块相比&#xff0c;DC电源模块有一些明显的区别和…

R语言ggplot2 | 热图+随机森林重要性!升级版~

&#x1f4cb;文章目录 原图复现定义ggrf_ggcor_plot()函数加载数据集一键出图函数优点 今天推出一个升级版&#xff1a; ggrf_ggcor_plot的函数。只需要输入 响应变量的矩阵和 解释变量的矩阵&#xff0c;就能轻松一键生成随机森林重要性相关性热图。 原图 所需复现的随机森…

推荐5款测试数据生成工具!

一个成功、有效的测试策略由下面几个基本部分组成&#xff1a;完整的测试覆盖率、最小化的环境影响和健壮的测试数据。 其中测试数据尤其重要&#xff0c;其质量直接关系到测试的有效性。可以把测试数据看作是保持测试引擎运行的燃料——高质量的测试数据有助于确保测试执行的…

极速体验DolphinScheduler 3.2.1 Standalone 版[一]

文章目录 极速体验DolphinScheduler 3.2.1 Standalone 版前置准备工作启动 DolphinScheduler Standalone Server解压并启动 DolphinScheduler登录 DolphinScheduler 启停服务配置数据库 极速体验DolphinScheduler 3.2.1 Standalone 版 Standalone 仅适用于 DolphinScheduler 的…

【go从入门到精通】函数详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法&#xff0c;用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出&#xff1a; 无向图&#xff1a; 割点与桥双连通分量 有向图&#xff1a; 强连通分量必经点与必经边 1.割点&#xff1a; 若从图中删除节点 x 以及所有与 x 关联的…

Intel AIPC发布会:开启AI终端应用的新纪元

2024年3月27日下午&#xff0c;Intel在北京市朝阳区凤凰中心举办了AIPC发布会开启了AI终端应用的新征程。 整场发布会围绕着‘让不可想象&#xff0c;变为寻常’主线进行。在本次发布会上&#xff0c;众多PC端的AI应用得到了展示&#xff0c;包括&#xff1a;智谱AI&#xff…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-寻找2020

数据很恶心&#xff0c;但是考点挺友好~ 把测试数据黏贴到记事本中&#xff0c;知测试数据的行列数 然后根据规则判断2020是否出现&#xff0c;并累计其次数即可。 判断可能需要注意超出下标&#xff0c;可以索性把数组定大些。 #include<stdio.h> const int N 310; ch…

哈曼卡顿音箱解决关闭自动休眠 + 自用车载音乐分享制作

一&#xff1a;哈曼卡顿音箱解决关闭自动休眠 1. 背景&#xff1a;每天做最多的事情就是开音箱电源。问了客服&#xff0c;说只有玻璃4才能关闭休眠。搞得我都想买新音箱了。 2. 解决办法&#xff1a;电脑开机启动一个阻止功放休眠.exe&#xff0c;可以设置自动启动&#x…

Redis入门到实战-第十九弹

Redis实战热身Count-min-sketch篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、…

Android Studio 无法下载 gradle-7.3.3-bin.zip

下载新的Android Studio&#xff0c;然后创建新的工程时&#xff0c;出现报错&#xff1a;Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.3.3-bin.zip 或者超时&#xff0c;我们可以复制&#xff1a;https://services.grad…

IntellIJ Idea 内存不足时怎么设置

文章目录 前言背景一、 内存显示二、 在IDEA中设置内存三 、在IDEA中打开内存的设置文件四、 JetBrains ToolBox 中安装 IntellIJ Idea配置文件位置总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章…