深度理解文件操作

目录

文件

文件名:

标准流

文件指针

文件的打开和关闭

文件的顺序读写:

使用部分

文件的打开和关闭


文件

文件分两种,第一种是程序文件,后一种是数据文件。

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

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

文件名:

文件名包含三部分:文件路径+文件名主干+文件后缀

例:c:\code\test.txt

进行文件操作时需要用到流

"流"(stream)通常用于描述数据的传输或处理。流可以是输入流(input stream)或输出流(output stream),它们分别用于从外部源读取数据或将数据写入外部目标。

输入流:输入流用于从外部源(比如文件、键盘、网络等)读取数据到程序中。在C语言中,你可以使用标准输入流(stdin)来接收用户输入,也可以使用文件输入流来读取文件中的数据。

输出流:输出流用于将程序中的数据写入外部目标(比如文件、屏幕、网络等)。在C语言中,你可以使用标准输出流(stdout)来输出到屏幕上,也可以使用文件输出流将数据写入文件。

标准流

stdin-标准输入流,可以将数据写入一个文本文件,并将该文件重定向到程序的标准输入。

stdout-标准输出流,程序的输出重定向到文件或其他位置,可以使用标准输出(stdout)重定向。

stderr-标准错误流,大多数环境中输出到显示器上面。

标准流的类型是FILE*,通常称为文件指针。

文件指针

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

每个被使用的文件都在内存中开辟了一个相应的文件信息区。这些信息保存在结构体变量中,该结构体由系统声明,取名FILE

结构体原型:

typedef struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
} FILE;

文件的读写

文件读写应先打开后关闭

ANSIC规定使用fopen函数打开文件,fclose来关闭文件。

//打开文件

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

//关闭文件

int fclose(FILE * stream);

文件的使用方式

文件的顺序读写:

fgetc和fputc

fgetc 是C标准库中用于从文件中读取一个字符的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

int fgetc(FILE *stream);

  • stream:指向 FILE 结构体的指针,表示要读取字符的文件流。

fgetc 函数的作用是从指定的文件流中读取一个字符,并将该字符作为无符号字符返回。如果到达文件末尾或者发生错误,它会返回 EOF(End Of File)。

fputc 是C标准库中用于向文件中写入一个字符的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

int fputc(int character, FILE *stream);

  • character:要写入到文件的字符。
  • stream:指向 FILE 结构体的指针,表示要写入字符的文件流。

fputc 函数的作用是向指定的文件流中写入一个字符。它会将指定的字符写入到文件中,并返回写入的字符。如果写入成功,则返回写入的字符;如果发生错误,返回 EOF

fgets和fputs

fgets 是C标准库中用于从文件流中读取一行数据的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

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

  • str:指向一个字符数组的指针,用于存储读取的字符串数据。
  • num:要读取的最大字符数(包括空字符)。
  • stream:指向 FILE 结构体的指针,表示要读取数据的文件流。

fgets 函数会从指定的文件流中读取一行数据(包括换行符),并将其存储到指定的字符数组中。它会一直读取直到遇到换行符 \n、文件结束符 EOF 或者读取了 num-1 个字符为止,并在最后添加一个 null 字符 \0 作为字符串的结尾。

fputs 是C标准库中用于向文件中写入字符串的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

int fputs(const char *str, FILE *stream);

  • str:要写入到文件的字符串。
  • stream:指向 FILE 结构体的指针,表示要写入字符串的文件流。

fputs 函数的作用是向指定的文件流中写入一个以 null 结尾的字符串。它会将指定的字符串写入到文件中,并返回非负值(非错误);如果发生错误,返回 EOF

fscanf和fprintf

fscanf 是C标准库中用于从文件中读取格式化输入的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

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

  • stream:指向 FILE 结构体的指针,表示要读取数据的文件流。
  • format:格式化字符串,指定了要读取的数据类型和格式。

fscanf 函数根据指定的格式字符串从文件流中读取数据,并根据格式进行解析和存储。它将读取的数据转换为相应的数据类型,并按照格式字符串的指示将数据存储到相应的变量中。

fprintf 是C标准库中用于将格式化数据输出到文件的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

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

  • stream:指向 FILE 结构体的指针,表示要输出数据的文件流。
  • format:格式化字符串,指定了要输出的数据类型和格式。

fprintf 函数根据指定的格式字符串将数据格式化后输出到指定的文件流中。它类似于 printf 函数,但是可以将输出重定向到文件而不是标准输出。

fread和fwrite

fread 是C标准库中用于从文件中读取数据的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

  • ptr:指向存储读取数据的内存块的指针。
  • size:要读取的每个数据项的字节数。
  • nmemb:要读取的数据项的数量。
  • stream:指向 FILE 结构体的指针,表示要读取数据的文件流。

fread 函数从文件流中读取数据,并将数据存储到指定的内存块中。它会返回实际读取的数据项数量,通常用于读取二进制数据。

fwrite 是 C 标准库中用于将数据写入文件的函数。它的原型定义在 <stdio.h> 头文件中,通常的函数原型如下:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

  • ptr:指向要写入文件的数据块的指针。
  • size:每个数据项的大小(字节数)。
  • nmemb:要写入的数据项的数量。
  • stream:指向 FILE 结构体的指针,表示要写入数据的文件流。

fwrite 函数将指定数量的数据项从内存中写入到文件中。它通常用于写入二进制数据到文件。

使用部分

文件的打开和关闭

以下是打开文件和关闭文件的操作

#include <stdio.h>int main()
{FILE* pf = fopen("data.txt", "w");//创建文件  打开文件if (pf == NULL){perror("fopen");return 1;}//写文件//....//关闭文件fclose(pf);pf = NULL;return 0;
}

这样就创建了data.txt文件

在我这里,D:\clone仓库\test.c\test_3_26表示当前目录
.表示当前目录
..表示上一目录

fputc和fgetc的使用

使用fputc写入26个小写字母


int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i = 0;for (i = 0; i < 26; i++){fputc('a' + i, pf);}fclose(pf);pf = NULL;return 0;
}

使用fgetc读取data.txt的内容

fputc和fgetc的读写都有一个共同的特点,就是光标会随着读写依次往后跳

使用fgetc函数读取data1.txt中的内容,再使用fputc函数输出到data.txt中

这里我先创建好了data1.txt并输入了内容abcdefghi。

另外需要注意的是当data2.txt开辟失败时,进行判断后,应先关闭文件data1.txt后置空。

int main()
{//D:\clone仓库\test.c\test_3_26表示当前目录//.表示当前目录//..表示上一目录FILE* pf1 = fopen("data1.txt", "r");//创建文件  打开文件if (pf1 == NULL){perror("fopen");return 1;}FILE* pf2 = fopen("data2.txt", "w");if (pf2 == NULL){fclose(pf1);pf1 = NULL;perror("fopen->data2.txt");return 1;}//写文件int ch = 0;while ((ch = fgetc(pf1)) != EOF){fputc(ch, pf2);}//关闭文件fclose(pf1);fclose(pf2);pf1 = NULL;pf2 = NULL;return 0;
}

fgets和fputs的使用

fputs一次写入一行

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abcdefg\n", pf);fputs("abcdefg\n", pf);fputs("abcdefg\n", pf);fclose(pf);pf = NULL;return 0;
}

fgets注意有三个参数,其中的num参数是最多读取多少个的意思,最多读取num-1个字符。

第一个参数是数组第二参数是num,第三个参数是文件指针,是把文件里的字符读取到数组中

这里data.txt是一堆字母,num是10,但一共读取了9个字符。

fscanf和fprintf的使用

读取带有格式化的字符

struct stu
{char neme[30];int age;double score;
};int main()
{struct stu s = { "zhangsan", 29, 99.5 };FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fprintf(pf, "%s %d %.1lf", s.neme, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

注意使用fscanf和scanf一样要&(取地址)

这里创建了一个未初始化的s使用fscanf函数读取data.txt的内容读入s中,后用fprintf打印再屏幕上。

fread和fwrite的使用

二进制的读写

fwrite四个参数,第一个是要写数据的起始地址,第二个是一个元素的大小,第三个是写入的个数,第四个是流

再文件出现了乱码,这就是二进制翻译出的字符,不能识别

struct stu
{char neme[30];int age;double score;
};int main()
{struct stu s = { "zhangsan", 19, 99.5 };FILE* pf = fopen("data.txt", "wb");//二进制读写if (pf == NULL){perror("fopen");return 1;}//写文件fwrite(&s, sizeof(s), 1, pf);//写到pf中fclose(pf);pf = NULL;return 0;
}

fread可以识别二进制的代码

struct stu
{char neme[30];int age;double score;
}s;int main()
{//struct stu s = { "zhangsan", 19, 99.5 };FILE* pf = fopen("data.txt", "rb");//二进制读写if (pf == NULL){perror("fopen");return 1;}//fwrite(&s, sizeof(s), 1, pf);//读文件fread(&s, sizeof(s), 1, pf);//写到pf中printf("%s %d %.1lf", s.neme, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

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

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

相关文章

如何使用WordPress插件保护网站的安全

前段时间我们的网站受到了黑客的攻击&#xff0c;网站丢失了一些重要的数据&#xff0c;为了防止这种情况的再次发生&#xff0c;我们准备将网站全部迁移到高防服务器&#xff0c;经过一番对比后&#xff0c;我们选择了Hostease提供的高防服务器。它可以有效地抵御各种类型的网…

银行单元化架构体系介绍

1.背景 自2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;我国科技受制于人的现状对国家稳定和经济发展都提出了严峻考验。目前我国IT架构体系严重依赖国外产品&#xff0c;金融行业尤其明显。大部分传统银行的关键账务系统都架设在IBM的大型机、小型机之上&…

【jenkins+cmake+svn管理c++项目】创建一个项目

工作台点击"新建item",进入下图&#xff0c;选择Freestyle project,并输入项目名称&#xff0c; 点击确定之后进入项目配置页面&#xff0c;填写描述&#xff0c;然后在下边源码管理部分选择svn, 填写代码的url 上图的Credentials处填写svn的有效登录名和密码&#x…

VMware虚拟机中的Ubuntu Samba映射Windows10文件夹

sudo apt-get install samba安装Samba mkdir share创建共享文件夹 sudo vim /etc/samba/smb.conf编辑配置文件 [share]comment VMware Ubuntu Sharepath /home/zhu/share browseable yeswritable yescreate mask 777comment 是简介 path 是共享文件夹的路径&#xff0c…

【MATLAB源码-第15期】基于matlab的MSK的理论误码率与实际误码率BER对比仿真,采用差分编码和IQ调制解调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在数字调制中&#xff0c;最小频移键控&#xff08;Minimum-Shift Keying&#xff0c;缩写&#xff1a;MSK&#xff09;是一种连续相位调制的频移键控方式&#xff0c;在1950年代末和1960年代产生。[1] 与偏移四相相移键控&a…

“数字化”持续走热,VR全景助力制造业上“云”

制造业要升级&#xff0c;数字化改造是重要途径。 早年间&#xff0c;由于对数字化的认识不足&#xff0c;一些企业明明有数字化改造需求&#xff0c;却不敢、不愿、不会上“云”。直到此次两会期间&#xff0c;2024年政府工作报告再次提出推动制造业数字化转型&#xff0c;越…

网络——套接字编程TCP

目录 服务端 创建套接字&#xff08;socket&#xff09; 服务端绑定&#xff08;bind&#xff09; 服务端监听&#xff08;listen&#xff09; 服务器接收&#xff08;accept&#xff09; 服务端处理&#xff08;read & write&#xff09; 客户端 创建套接字&#…

CVE-2022-33891 Apache Spark shell 命令注入漏洞分析

漏洞简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架 Spark&#xff0c;拥有Hadoop MapReduce所具有的优点&#xff1b;但不同于MapReduce的…

鸿蒙OS开发实例:【demo选择列表限定数量】

效果图&#xff1a; 示例代码 // 使用 DevEco Studio 3.1.1 Release 及以上版本&#xff0c;API 版本为 api 9 及以上。 // 主要功能及注意事项&#xff1a; // 该组件展示了一个乘客选择列表。列表中的每个项目包含一个复选框和对应的乘客姓名&#xff0c; // 用户点击任意一…

MATLAB 自定义生成圆柱点云(49)

MATLAB 自定义生成圆柱点云(49) 一、算法介绍二、具体实现1.代码2.效果一、算法介绍 按照一些提前指定的圆柱参数,自定义生成圆柱点云,可添加噪声,用于后续的实验测试 二、具体实现 1.代码 代码如下(示例): % 指定圆柱的参数 radius = 5; % 圆柱半径 height = 20…

【Spring源码】Bean采用什么数据结构进行存储

一、前瞻 经过上篇源码阅读博客的实践&#xff0c;发现按模块阅读也能获得不少收获&#xff0c;而且能更加系统地阅读源码。 今天的阅读方式还是按模块阅读的方式&#xff0c;以下是Spring各个模块的组成。 那今天就挑Beans这个模块来阅读&#xff0c;先思考下本次阅读的阅读…

Jmeter脚本优化——随机函数

线程组下有 2 个请求的参数中均使用到相同的参数&#xff0c;在进行参数化时&#xff0c;想 要每个请求使用不同的取值。 &#xff08; 1 &#xff09; 线程组设置如下 &#xff08; 2 &#xff09; 线程组下添加加购物车请求&#xff0c;请求传参包含商品 id &#xff08;…

前端日期组件layui使用,月模式

初学前端&#xff0c;实战总结 概要 有一个日期组件&#xff0c;我的谷歌浏览器选完日期后&#xff0c;偶尔获取不到最新数据&#xff0c;有一个客户&#xff0c;是经常出不来数据。 日期组件是Wdate&#xff1a;调用的方法是WdatePicker onpicking&#xff0c;代码片段如下…

基于AT89C51单片机的智能交通灯设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89035863?spm1001.2014.3001.5503 1绪 论 1.1课题研究背景 交通是城市经济活动的命脉&#xff0c;对城市经济发展、人民生活水平的提高起着十分重要的作用。城市交…

干货分享DS5L1伺服电机通过倍讯科技485转 Profinet 网关与西门子PLC进行通信的配置方法

倍讯科技485转 ProfinetDS5L1 伺服电机与 Profinet 网关进行通信需要了解 Profinet 协议和伺服电机的具体通信要求。以下是您可以如何解决此问题的总体概述&#xff1a; 了解 Profinet&#xff1a;Profinet 是自动化工业以太网标准。您需要了解 Profinet 的工作原理、其寻址方案…

纳斯达克大屏:媒体尺寸及投放费用详解

纳斯达克大屏媒体尺寸及投放费用详解 纳斯达克图片要求 像素 纳斯达克大屏媒体图片的像素要求为2336 H x 1832 W (pixels)。确保你的图片符合这一尺寸要求&#xff0c;以确保在大屏上的显示效果最佳。 分辨率 分辨率要求为(1.0) px 72 dpi。这意味着每个像素显示为一个实…

Spire.PDF for .NET【文档操作】演示:查找并删除 PDF 中的空白页

PDF 中的空白页并不罕见&#xff0c;因为它们可能是作者故意留下的或在操作文档时意外添加的。当您阅读或打印文档时&#xff0c;这些空白页可能会很烦人&#xff0c;因此可能非常有必要将其删除。在本文中&#xff0c;您将了解如何使用Spire.PDF for .NET以编程方式查找和删除…

亲测有效Djiango连接oracle

navicat连接本地oracle截图。 Djiango下面settings.py下面的DATABASES&#xff1a; 注意&#xff1a;USER最好不要用sys或者system可能会导致连接不了&#xff0c;最好是自己新建的oracle用户。

【C++11】thread线程库

【C11】thread线程库 目录 【C11】thread线程库thread类的简单介绍函数指针lambda表达式常用在线程中 线程函数参数join与detach利用RAII思想来自动回收线程 原子性操作库(atomic)atomic中的load函数&#xff1a;atomic中对变量进行原子操作的一些函数 CAS(Compare-And-Swap)无…

VGG16神经网络搭建

一、定义提取特征网络结构 将要实现的神经网络参数存放在列表中&#xff0c;方便使用。 数字代表卷积核的个数&#xff0c;字符代表池化层的结构 cfgs {"vgg11": [64, M, 128, M, 256, 256, M, 512, 512, M, 512, 512, M],VGG13: [64, 64, M, 128, 128, M, 256, …