C 语言文件读写

C 语言文件读写

在本教程中,您将学习如何在C语言中处理文件。您将通过示例学习在C语言中使用fprintf()、fscanf()、fread()、fwrite()、fseek()等处理标准I/O。

文件是计算机存储设备中用于存储数据的容器。

为什么需要文件?

  • 当程序终止时,所有数据都会丢失。即使程序终止,存储在文件中也会保留您的数据。
  • 如果必须输入大量数据,则将花费大量时间来全部输入。
    但是,如果您有一个包含所有数据的文件,则可以使用C中的一些命令方法轻松地访问文件的内容。
  • 您可以轻松地将数据从一台计算机移动到另一台计算机,而无需进行任何更改。

文件类型

处理文件时,您应该了解两种类型的文件:

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

1.文本文件

文本文件是普通的**.txt**文件。您可以使用任何简单的文本编辑器(例如记事本)轻松创建文本文件。

打开这些文件时,您将以纯文本形式看到文件中的所有内容。您可以轻松地编辑或删除内容。

它们以最少的维护工作,易于阅读,提供最少的安全性并占用更大的存储空间。

2.二进制文件

二进制文件主要是计算机中的**.bin**文件。

它们不是以纯文本格式存储数据,而是以二进制格式(0和1)存储数据。

与文本文件相比,它们可以容纳更多数据,不易读取,并提供更好的安全性。

文件操作

在C中,您可以对文件执行四个主要操作:

  1. 创建一个新文件
  2. 打开现有文件
  3. 关闭文件
  4. 读取信息并将信息写入文件

处理文件

处理文件时,需要声明文件类型的指针。文件和程序之间的通信需要此声明。

FILE *fptr;

打开文件-用于创建和编辑

使用stdio.h头文件中定义的fopen()函数打开文件。

在标准I / O中打开文件的语法为:

ptr = fopen("fileopen","mode");

例如,

fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
  • 假设该文件newprogram.txt在路径E:\cprogram中不存在。第一个函数创建一个名为newprogram.txt的新文件,并按照**‘w’**模式打开该文件进行写入。
    写入模式允许您创建和编辑(覆盖)文件的内容。
  • 现在,假设第二个二进制文件oldprogram.bin存在于路径E:\cprogram中。第二个函数打开现有文件,以二进制模式**‘rb’**读取。
    读取模式仅允许您读取文件,而不能写入文件。
模式模式的含义文件不存在期间
r以只读方式打开。如果文件不存在,则fopen()返回NULL。
rb打开以二进制模式读取。如果文件不存在,则fopen()返回NULL。
w打开文本文件,允许写入文件。打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
wb打开文件以二进制方式写入。如果文件存在,其内容将被覆盖。 如果文件不存在,将创建它。
a打开进行追加。 数据添加到文件末尾。如果文件不存在,将创建它。
ab打开以二进制方式追加。数据添加到文件末尾。如果文件不存在,将创建它。
r+开放供阅读和写作。如果文件不存在,则fopen()返回NULL。
rb+打开以二进制方式读取和写入。如果文件不存在,则fopen()返回NULL。
w+打开一个文本文件,允许读写文件如果文件存在,其内容将被覆盖。如果文件不存在,将创建它。
wb+打开以二进制方式读取和写入。如果文件存在,其内容将被覆盖。 如果文件不存在,将创建它。
a+打开以阅读和追加。如果该文件不存在,它将被创建。
ab+打开以二进制模式读取和追加。如果文件不存在,将创建它。

关闭文件

读取/写入后,应关闭文件(文本文件和二进制文件)。

使用fclose()函数可以关闭文件。

fclose(fptr);

在这里,fptr是与要关闭的文件关联的文件指针。

读取和写入文本文件

为了读取和写入文本文件,我们使用fprintf()和fscanf()函数。

它们只是printf()和scanf()的文件版本。 唯一的区别是fprint()和fscanf()需要指向结构FILE的指针。

示例1:写入文本文件

#include <stdio.h>
#include <stdlib.h>int main()
{int num;FILE *fptr;// 如果您使用的是MacOS或Linux,请使用正确的路径fptr = fopen("C:\\program.txt","w");if(fptr == NULL){printf("Error!");   exit(1);             }printf("Enter num: ");scanf("%d",&num);fprintf(fptr,"%d",num);fclose(fptr);return 0;
}

该程序从用户那里获取一个号码并将其存储在文件中program.txt。

编译并运行该程序后,您可以看到program.txt在计算机的C驱动器中创建的文本文件。打开文件时,您可以看到输入的整数。

示例2:从文本文件读取

#include <stdio.h>
#include <stdlib.h>int main()
{int num;FILE *fptr;if ((fptr = fopen("C:\\program.txt","r")) == NULL){printf("Error! opening file");//如果文件指针返回NULL,则程序退出。exit(1);}fscanf(fptr,"%d", &num);printf("Value of n=%d", num);fclose(fptr); return 0;
}

该程序读取program.txt文件中存在的整数并将其打印到屏幕上。

如果您从示例1成功创建了文件,运行此程序将为您提供输入的整数。

其他函数,如fgetchar(),fputc()等,可以以类似的方式使用。

读写二进制文件

在二进制文件的情况下,fread()和fwrite()函数用于分别读取和写入磁盘上的文件。

写入二进制文件

要写入二进制文件,需要使用fwrite()函数。这些函数采用四个参数:

  1. 要写入磁盘的数据地址
  2. 要写入磁盘的数据大小
  3. 此类数据的数量
  4. 指向要写入的文件的指针。
fwrite(addressData, sizeData, numbersData, pointerToFile);

示例3:使用fwrite()写入二进制文件

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","wb")) == NULL){printf("Error! opening file");// 如果文件指针返回NULL,则程序退出。exit(1);}for(n = 1; n < 5; ++n){num.n1 = n;num.n2 = 5*n;num.n3 = 5*n + 1;fwrite(&num, sizeof(struct threeNum), 1, fptr); }fclose(fptr); return 0;
}

在此程序中,我们在C驱动器中创建一个新文件program.bin。

我们声明具有三个数字n1,n2和n3的结构体threeNum,并将其在主函数中定义为num。

现在,在for循环中,我们使用fwrite()将值存储到文件中。

第一个参数接受num的地址,第二个参数接受结构threeNum的大小。

由于我们仅插入num的一个实例,因此第三个参数为1。最后一个参数* fptr指向我们要存储数据的文件。

最后,我们关闭文件。

从二进制文件读取

fread()函数也采用与上述fwrite()函数相似的4个参数。

fread(addressData, sizeData, numbersData, pointerToFile);

示例4:使用fread()从二进制文件读取

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","rb")) == NULL){printf("Error! opening file");//如果文件指针返回NULL,则程序退出。exit(1);}for(n = 1; n < 5; ++n){fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);}fclose(fptr); return 0;
}

在此程序中,您读取相同的文件program.bin,并逐个循环浏览记录。

简单来说,您将从* fptr指向的文件中读取一个threeNum大小的threeNum*fptrnum记录到num结构中。

您将获得与示例3中插入的记录相同的记录。

使用fseek()获取数据

如果文件中有很多记录,并且需要访问特定位置的记录,则需要遍历所有记录才能获取该记录。

这将浪费大量的内存和操作时间。使用fseek()可以轻松获得所需数据。

顾名思义,fseek()将光标定位到文件中的给定记录。

fseek()的语法

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

第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置,第三个参数指定偏移量开始的位置。

位置含义
SEEK_SET从文件开头开始偏移。
SEEK_END从文件的末尾开始偏移。
SEEK_CUR从文件中光标的当前位置开始偏移。

示例5:fseek()

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","rb")) == NULL){printf("Error! opening file");//如果文件指针返回NULL,则程序退出。exit(1);}// 将光标移到文件末尾fseek(fptr, -sizeof(struct threeNum), SEEK_END);for(n = 1; n < 5; ++n){fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);cfseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);}fclose(fptr); return 0;
}

该程序将以相反的顺序(从最后到第一)开始从文件program.bin中读取记录并进行打印。

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

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

相关文章

vue2,vue3使用vuex

vuex vue的状态管理器 1引入vuex npm install vuex2.创建store/index.js文件 在main.js引入 import { createStore } from vuexconst store createStore({state: () > ({})}) export default store3.state 核心, 用于定义数据 state: () > ({count: 0,name: 陆青,age:…

Py之wikipedia-api:wikipedia-api的简介、安装、使用方法之详细攻略

Py之wikipedia-api&#xff1a;wikipedia-api的简介、安装、使用方法之详细攻略 目录 wikipedia-api的简介 wikipedia-api的安装 wikipedia-api的使用方法 1、 创建 Wikipedia并进行查询 wikipedia-api的简介 Wikipedia-API是一个易于使用的Python封装&#xff0c;用于访…

计算机是如何执行指令的

计算机组成 现在所说的计算机基本上都是冯诺依曼体系的计算机。其核心原理&#xff1a; 冯诺依曼计算的核心思想是将程序指令和数据以二进制形式存储存储在同一存储器中&#xff0c;并使用相同的数据格式和处理方式来处理它们。这种存储程序的设计理念使得计算机能够以可编程…

如何从 C# 制作报表到 FastReport Cloud

众所周知&#xff0c;我们的世界在不断发展&#xff0c;新技术几乎每天都会出现。如今&#xff0c;不再需要在办公室内建立整个基础设施、雇用人员来监控设备、处理该设备出现的问题和其他困难。 如今&#xff0c;越来越多的服务提供业务云解决方案&#xff0c;例如FastReport…

合并PDF出现OOM异常

优化方法一&#xff1a;使用PdfSmartCopy类代替PdfCopy类。这个类可以在合并PDF文件时&#xff0c;检测并消除重复的对象&#xff0c;从而减少内存的占用。您可以参考以下代码示例&#xff1a; //创建一个Document对象 Document document new Document();//创建一个PdfSmartC…

SpringBoot 项目实现读写分离

SpringBoot 项目实现读写分离 一、读写分离介绍 当使用Spring Boot开发数据库应用时&#xff0c;读写分离是一种常见的优化策略。读写分离将读操作和写操作分别分配给不同的数据库实例&#xff0c;以提高系统的吞吐量和性能。 读写分离实现主要是通过动态数据源功能实现的&…

我的虚拟人物介绍

背景 大家好&#xff0c;我是小欣&#xff0c;是这个博客的虚拟助手。在这里&#xff0c;我将为大家提供各种有趣、实用、甚至是意想不到的信息。作为一个年轻的语言模型&#xff0c;我的目标是为你们呈现出最有趣和有深度的内容。 我喜欢与大家分享知识、解答问题&#xff0…

AI“胡说八道”?怎么解?

原创 | 文 BFT机器人 01 引言 近年来&#xff0c;人工智能产业迅猛发展&#xff0c;大型语言模型GPT-4发展势头强劲&#xff0c;OpenAI推出ChatGPT、微软推出Bing、马斯克推出“最好的聊天机器人Grok”……科技巨头纷纷入局AI领域&#xff0c;引入人工智能作为办公工具的行业…

合封芯片未来趋势如何?合封优势能否体现?

芯片已经成为现代电子设备的核心组件。为了提高系统的性能、稳定性和功耗效率&#xff0c;一种先进的芯片封装技术——合封芯片应运而生。 合封芯片作为一种先进的芯片封装技术&#xff0c;合封芯片是一种将多个芯片&#xff08;多样选择&#xff09;或不同的功能的电子元器件…

AIGC专题报告:生成式人工智能用例汇编

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题报告&#xff1a;生成式人工智能用例汇编》。 &#xff08;报告出品方&#xff1a;德勤&#xff09; 报告共计&#xff1a;16页 生成式人工智能&#xff08;AI&#xff09;的兴起 生成式AI给人类文明创造了无限的可…

文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题

二、用go语言&#xff0c;二叉搜索树性质与最小堆性质(见 6.1 节)之间有什么不同?能使用最小堆性质在 O(n)时间内按序输出一棵有 n 个结点树的关键字吗?可以的话&#xff0c;请说明如何做&#xff0c;否则解释理由。 文心一言&#xff1a; 在二叉搜索树&#xff08;Binary …

如何更有效地进行薪酬调查?

薪酬调查是企业管理中非常重要的一环&#xff0c;它不仅能够帮助企业了解员工的薪酬情况&#xff0c;还可以为企业提供合理的薪酬标准&#xff0c;从而吸引和留住优秀人才。然而&#xff0c;进行薪酬调查并不是一项简单的任务&#xff0c;需要有一定的方法和技巧&#xff0c;许…

ruoyi 若依框架采用第三方登录

在项目中&#xff0c;前后端分离的若依项目&#xff0c;需要通过统一认证&#xff0c;或者是第三方协带认证信息跳转到本系统的指定页面。需要前后端都做相应的改造&#xff0c;由于第一次实现时已过了很久&#xff0c;再次重写时&#xff0c;发现还是搞了很长时间&#xff0c;…

PasteNow for mac剪贴板工具

PasteNow 是一款简单易用的剪贴板管理工具&#xff0c;可帮助用户快速存储和管理剪贴板上的文本和图片内容。用户可以使用 PasteNow 软件快速将文本内容保存到不同的笔记或页面中&#xff0c;也可以方便地将剪贴板上的图片保存到本地或分享给其他应用程序。 此外&#xff0c;P…

如何进行合理的股权激励?

股权激励是企业激励员工和管理层的一种重要手段&#xff0c;通过向员工提供股权&#xff0c;可以将他们与企业利益紧密联系在一起&#xff0c;激发员工的积极性和创造力&#xff0c;提高公司的绩效和竞争力。然而&#xff0c;要实施合理的股权激励&#xff0c;需要考虑多个因素…

vue 通过ref调用router-view子组件的方法

由于用的vue2.7版本&#xff0c;但用了vue3 setup的语法&#xff1b; 注意&#xff1a;是vue2的template结构&#xff0c;vue3的setup语法&#xff1b;非这种情况需要举一反三。 处理方案&#xff1a; 1、对router-view加上ref template修改 直接对router-view加上ref&#x…

金蝶云星空和四化智造MES(WEB)单据接口对接

金蝶云星空和四化智造MES&#xff08;WEB&#xff09;单据接口对接 对接系统&#xff1a;四化智造MES&#xff08;WEB&#xff09; MES系统是集成生产管理、品质管理、设备管理、BI数据中心、库存管理、工时管理、数据采集、看板管理等为一体的综合性生产管理系统。通过强调制造…

wagtail-安装配置

系列文章目录 文章目录 系列文章目录安装虚拟环境安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 安装虚拟环境 https://blog.csdn.net/gsl371/article/details/117917857 安装wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

淘宝88vip退费问题

前一段时间&#xff0c;双十一活动&#xff0c;想着开个淘宝的88vip领卷买东西会实惠一点&#xff0c;另外&#xff0c;它自带的权益也不错&#xff0c;有饿了吗、网易云、优酷或者芒果的。但是到了当天发现&#xff0c;一个vip的卷也用不了&#xff0c;顿感什么恼火&#xff0…

synchronized的轻量级锁居然不会自旋?

《Java并发编程的艺术》中说到「如果失败&#xff0c;表示其他线程竞争锁&#xff0c;当前线程便尝试使用自旋来获取锁」&#xff0c;并且下文所配的流程图中明确表示自旋失败后才会升级为重量级锁&#xff0c;但《深入理解Java虚拟机》又说「如果出现两条以上的线程争用同一个…