【C语言】文件操作讲解

C语言文件操作讲解

  • 文件
  • 文件名
  • 文件类型
    • 数据在内存中的存储
  • 文件缓冲区
  • 文件指针
  • 文件的打开与关闭
    • fopen
    • fclose
    • fopen与fclose的使用
    • 文件的打开方式
  • 文件的顺序读写
    • fputc
    • fgetc
    • fputs
    • fgets
    • fprintf
    • fscanf
    • fwrite
    • fread
    • 输入流与输出流
    • 对比scanf\fscanf\sscanf与printf\fprintf\sprintf
      • sscanf与sprintf
  • 文件的随机读写
    • fseek
    • ftell
    • rewind
  • 文件结束判断

文件

我们熟知,我们常见的文件就是磁盘上存储的文件。在程序设计中,所涉及的文件有俩种:程序文件、数据文件

  • 程序文件:

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

  • 数据文件:

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

在vs中使用printf和scanf处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。同时可以将信息输出到磁盘上,当需要的时候将磁盘上的数据读取到内存上使用,即处理磁盘上文件

文件名

一个文件有一个唯一的文件标识,以便用户识别与引用。

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

例如:D:\code\c_languege_2\c_2004_5_13(7)\c_2004_5_13(7)\test.c

文件标识常被称为文件名

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件

  • 文本文件

数据原本在内存中以二进制形式存储,如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

  • 二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

数据在内存中的存储

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储

以100000为例:

以ASCII码形式输出到磁盘:
1 0 0 0 0
相当于在磁盘中占用了五个字节,每个字符与每个字符都是分开计算的
00110001 00110000 00110000 00110000 00110000

以二进制形式输出到磁盘(以电脑的存储方式为小端为例)
10 27 00 00
以十六进制的形式显示,每俩个数代表一个字节
00000000 00000000 00100111 00010000

使用代码测试:

#include<stdio.h>
int main(void)
{int a = 0;//FILE后面介绍FILE* pf = fopen("test.txt", "wb");//以二进制形式写到文中fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

文件缓冲区

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

文件指针

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

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

  • FILE在某些编译器上的声明
struct _iobuf
{char* _ptr;int _cnt;char* _base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;
};
typedef struct _iobuf FILE;

不同的编译器定义的FILE类型包含的内容不完全相同。

每次打开文件时,系统会根据文件的情况自动创建一个FILE结构的变量,并填充信息。

  • 使用指针维护FLIE结构的变量:
	FILE* pf;

pf指针是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就可以访问该文件,即通过指针变量找到与FILE相关联的文件

文件的打开与关闭

fopen

在这里插入图片描述

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

  • fopen的介绍:

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

文件在读写之前打开文件

fclose

在这里插入图片描述

  • fclose介绍

int fclose(FILE* stream);

在文件使用结束后关闭文件

fopen与fclose的使用

#include<stdio.h>
int main(void)
{FILE* pf = fopen("test.txt", "w");if(pf!=NULL){fputs("fopen",pf);fclose(pf);}return 0;
}

文件的打开方式

文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新文件
“a”(追加)向文本文件尾添加数据出错
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新文件
“rb+”(读写)为了读和写,打开一个二进制文件出差
“wb+”(读写)为了读和写,新建一个二进制文件建立一个新文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新文件

文件的顺序读写

功能函数名适用于
字符输入函数fgets所以输入流
字符输出函数fputs所以输入流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

fputc

在这里插入图片描述

  • fputc介绍:

int fputc ( int character, FILE * stream );
向流中输入字符

int main(void)
{//以只写的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//向文件中写字符fputc('h', pf);fputc('e', pf);fputc('l', pf);fputc('l', pf);fputc('o', pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fgetc

在这里插入图片描述

  • fgetc介绍:

int fgetc ( FILE * stream );
从流中读取字符

  • fgetc实际使用:
int main(void)
{//以只读的方式打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读取文件中的字符char ch;ch = fgetc(pf);printf("%c ",ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fputs

在这里插入图片描述

  • fputs介绍:

int fputs ( const char * str, FILE * stream );
向流中输入字符串

int main(void)
{//以只写的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//向文件中的写字符串fputs("hello\n", pf);fputs("world", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fgets

在这里插入图片描述

  • fgets介绍:

char * fgets ( char * str, int num, FILE * stream );
从流中读取字符串

int main(void)
{//以只读的方式打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读取文件中的字符串char ch[20];fgets(ch, 20, pf);printf("%s", ch);fgets(ch, 20, pf);printf("%s", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fprintf

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

  • fprintf介绍:

int fprintf ( FILE * stream, const char * format, … );
向流中输入格式数据

int main(void)
{struct stu{char name[10];int age;char sex[5];};struct stu s = { "小明",6,"男"};//以只写的方式打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//向文件中的输入格式数据fprintf(pf, "%s %d %s", s.name, s.age, s.sex);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fscanf

在这里插入图片描述

  • fscanf介绍:

int fscanf ( FILE * stream, const char * format, … );
向流中读取格式化数据

int main(void)
{struct stu{char name[10];int age;char sex[5];};struct stu s = {0 };//以只读的方式打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//向文件中的输入格式数据fscanf(pf, "%s %d %s", s.name, &(s.age), &(s.sex));printf("%s %d %s", s.name, s.age, s.sex);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fwrite

在这里插入图片描述

  • fwrite介绍

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );向流中输入二进制数据

struct stu
{char name[10];int age;char sex[5];
};int main(void)
{struct stu s = { "小明",20,"男" };FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen");return 1;}//向流中输入二进制数据fwrite(&s, sizeof(struct stu), 1, pf);fclose(pf);pf==NULL;return 0;
}

fread

在这里插入图片描述

  • fread介绍:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );从流中读取二进制的数据

struct stu
{char name[10];int age;char sex[5];
};int main(void)
{struct stu s = { 0 };FILE* pf = fopen("test.txt", "rb");if (pf == NULL){perror("fopen");return 1;}//从流中读取二进制的数据fread(&s, sizeof(struct stu), 1, pf);printf("%s %d %s",s.name,s.age,s.sex);fclose(pf);pf == NULL;return 0;
}

在这里插入图片描述

输入流与输出流

在这里插入图片描述

与平常在学习c语言过程中使用scanf与printf类似,scanf将键盘上的数据读取到内存上,printf将内存上的数据打印在屏幕上,内存面向文件时也是同样的操作,使用fputs,fputc,fprintf将数据输出到文件中,使用fgets,fgetc,fscanf将数据从文件读取到内存中。

在面向文件时,数据会通过一种方式来与文件进行输入输出,而数组不仅仅可以面向文件,还可以面向屏幕,文件,网络,网盘等等,这时就需要一种流来将数据传输在不同的输出设备上,以便程序员使用。

在任何一个C语言程序运行的时候都会默认打开三个流:stdin,stdout,stderr.

在这里插入图片描述

printf与scanf都是仅适用于标准输入流,标准输出流

struct stu
{char name[10];int age;char sex[5];
};int main(viod)
{struct stu s = { 0 };//键盘格式化输入数据fscanf(stdin, "%s %d %s", s.name, &(s.age), &(s.sex));//屏幕格式化输出数据fprintf(stdout, "%s %d %s", s.name, s.age, s.sex);return 0;
}

在这里插入图片描述

对比scanf\fscanf\sscanf与printf\fprintf\sprintf

  • scanf与printf
    scanf——从键盘上读取格式化的数据(stdin)
    printf——把数据写到(输出)屏幕(stdout)

  • fscanf与fprintf

fscanf——针对所有输入流的格式化的输入函数(stdin,打开的文件等等)
fprintf——针对所有输出流的格式化的输出函数(stdout,打开的文件等等)

  • sscanf与sprintf

sscanf——从一个字符串中还原一个格式化数据
sprintf——把一个格式化的数据,存放在(转换成)一个字符串

sscanf与sprintf

  • sscanf介绍

在这里插入图片描述

  • sprintf介绍

在这里插入图片描述
sscanf与sprintf使用:

struct stu
{char name[10];int age;char sex[5];
};int main(void)
{struct stu s = { "小明",20,"男" };//sprintf——把一个格式化的数据,存放在(转换成)一个字符串char ch[100] = { 0 };sprintf(ch, "%s %d %s", s.name, s.age, s.sex);printf("%s\n", ch);//sscanf——从一个字符串中还原一个格式化数据struct stu tmp = { 0 };sscanf(ch, "%s %d %s", tmp.name, &(tmp.age), &(tmp.sex));printf("%s %d %s", tmp.name, tmp.age, tmp.sex);return 0;
}

在这里插入图片描述

文件的随机读写

fseek

在这里插入图片描述

  • fseek介绍:

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

根据文件指针位置和偏移量来定位文件指针

int main(void)
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}else{char tmp;tmp = fgetc(pf);printf("%c\n",tmp);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);return 0;}
}

在这里插入图片描述

ftell

在这里插入图片描述

  • ftell介绍

long int ftell ( FILE * stream );

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

int main(void)
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}else{char tmp;tmp = fgetc(pf);printf("%c\n",tmp);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);//与起始位置的偏移量int num = ftell(pf);printf("%d\n",num);return 0;}
}

在这里插入图片描述

rewind

在这里插入图片描述

  • rewind介绍

void rewind ( FILE * stream );

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

int main(void)
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}else{char tmp;tmp = fgetc(pf);printf("%c\n",tmp);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);fseek(pf, -1, SEEK_CUR);tmp = fgetc(pf);printf("%c\n", tmp);//与起始位置的偏移量int num = ftell(pf);printf("%d\n",num);//回到起始位置rewind(pf);tmp = fgetc(pf);printf("%c\n", tmp);return 0;}
}

在这里插入图片描述

文件结束判断

  • feof介绍

在这里插入图片描述

int feof ( FILE * stream );

文件读取结束的判断:

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

feof——应用于当文件读取结束的时候,判断是读取失败还是遇到文件尾结束

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

文件读取结束之后,需要判断读取结束的原因:
feof——返回真,说明是文件正常读取遇到了结束标志而结束的

ferror——返回真,说明是文件在读取过程中出错而结束的(外部原因)

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

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

相关文章

汇编原理(二)寄存器——内存访问

一个字 两个字节 双字 字节为8位 字为16位&#xff08;看两格&#xff09; 双子dword32位&#xff08;看四格&#xff09; 内存中字的存储&#xff1a; 0地址单元中存放的字节型数据是多少&#xff1f; 0地址字单元中存放的字型数据是多少&#xff1f; 2地址字单元中存放…

Secure Operation

文章目录 Secure Summation OperationSecure Set Union Operation Secure Summation Operation 让我们通过一个具体的例子来说明这个算法。 假设有三个数据拥有者 S1, S2 和 S3&#xff0c;他们分别持有以下值&#xff1a; S1 持有 value1 10S2 持有 value2 20S3 持有 val…

基坑气膜:建筑工地环保新利器—轻空间

随着城市化进程的加快&#xff0c;建筑行业的飞速发展带来了严重的环境问题&#xff0c;如噪音和粉尘污染&#xff0c;给人们的生活带来诸多不便。为了解决这些问题&#xff0c;建筑行业一直在探索更为环保和高效的施工方式。近年来&#xff0c;基坑气膜技术逐渐崭露头角&#…

Audition 2024 for Mac/Win:音频录制与编辑的卓越之选

随着数字媒体的不断发展&#xff0c;音频内容创作已经成为各行各业中不可或缺的一部分。无论是音乐制作、广播节目、播客录制还是影视配音&#xff0c;都需要高品质的音频录制和编辑工具来实现专业水准的作品。在这个充满竞争的时代&#xff0c;要想在音频创作领域脱颖而出&…

解线性方程组——最速下降法及图形化表示 | 北太天元 or matlab

一、思路转变 A为对称正定矩阵&#xff0c; A x b Ax b Axb 求解向量 x x x这个问题可以转化为一个求 f ( x ) f(x) f(x)极小值点的问题&#xff0c;为什么可以这样&#xff1a; f ( x ) 1 2 x T A x − x T b c f(x) \frac{1}{2}x^TAx - x^Tb c f(x)21​xTAx−xTbc 可…

ZooKeeper安装

安装Zookeeper 1、下载Zookeeper安装包 打开链接选择一个版本进行下载 https://zookeeper.apache.org/releases.html2、上传Zookeeper安装包到集群 输入命令 scp apache-zookeeper-3.8.4-bin.tar.gz hadoop192.168.88.100:/tmp也可以使用xftp等上传&#xff0c;物理机用u盘…

《精通Stable Diffusion AI绘画:基础技巧、实战案例与海量资源一站式学习》

随着人工智能技术的迅猛发展&#xff0c;AI绘画已经成为了一个炙手可热的话题。特别是在设计、艺术和创意领域&#xff0c;AI绘画工具的出现无疑为创作者们带来了更多的可能性和便利。《Stable Diffusion AI绘画从提示词到模型出图》这本书&#xff0c;就是一本深入解析Stable …

恢复视频3个攻略:从不同情况下的恢复方法到实践!

随着科技的进步&#xff0c;我们的生活被各种各样的数字内容所包围&#xff0c;其中&#xff0c;视频因其独特的记录性质&#xff0c;承载着许多重要的资料。但不管是自媒体人还是普通人日常生活随手一拍&#xff0c;都会遇到误删视频的情况。为了帮助您找回手机视频&#xff0…

从零学爬虫:使用比如说说解析网页结构

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例&#xff1a;查看网页结构 三、使用比如说说解析网页 1.…

windows10更改文件默认打开软件

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

纽曼硬盘隐藏文件丢失怎么恢复?介绍几种有效的方法

纽曼硬盘作为存储设备中的佼佼者&#xff0c;以其高性能和稳定性受到了广大用户的青睐。然而&#xff0c;在使用过程中&#xff0c;有时我们可能会遇到一些意想不到的问题&#xff0c;比如隐藏文件的丢失。这对于依赖这些文件进行工作或生活的人来说无疑是一个巨大的困扰。那么…

旋转矩阵00

题目链接 旋转矩阵 题目描述 注意点 将图像旋转 90 度不占用额外内存空间 解答思路 需要找到将图像旋转90度的规律&#xff0c;为了不占用额外内存空间&#xff0c;可以先将图像上下翻转&#xff0c;然后再将图像沿着主对角线进行翻转&#xff0c;得到的就是旋转90度之后的…

pdf打开方式怎么设置默认?分享这几种设置方法

pdf打开方式怎么设置默认&#xff1f;你是否曾遇到过打开PDF文档时&#xff0c;默认的打开程序并非你所需要的&#xff0c;从而影响了工作效率&#xff1f;别担心&#xff0c;本文将为你详细解读如何设置PDF的默认打开方式&#xff0c;让你的工作更加高效便捷。 首先&#xff0…

OrangePi AIpro 开箱初体验及语音识别样例

OrangePi AIpro 开箱初体验及语音识别样例 一、 前言 首先非常感谢官方大大给予这次机会&#xff0c;让我有幸参加此次活动。 OrangePi AIpro联合华为精心打造&#xff0c;采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;…

2951. 找出峰值

找出数组中的峰值 给你一个下标从 0 开始的数组 mountain 。你的任务是找出数组 mountain 中的所有 峰值。 以数组形式返回给定数组中 峰值 的下标&#xff0c;顺序不限 。 注意 峰值 是指一个严格大于其相邻元素的元素。数组的第一个和最后一个元素 不 是峰值。 示例 1 …

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? 汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? UV胶固化后的耐高温和低温能力取决于具体的UV胶水品牌和型号&#xff0c;以及固化过程中的条件。一般来说&#xff0c;高品质的UV胶水在固化后可以提供较好的耐温性能&#xff0c;但确切的耐温范围需要参考各个厂家提…

Mac 安装 PostgreSQL简易教程

Mac 安装 PostgreSQL简易教程 下载安装包 下载安装包 下载地址 我下载的文件&#xff1a;Postgres-2.7.3-16.dmg 双击 dmg 文件安装 拖拽图标到右边的文件&#xff0c;然后到应用程序中找到 Postgres.app 双击打开。 然后点击 Initialize 按钮 配置$PATH 到命令下工具&#…

虚拟化技术 分布式资源调度

一、实验内容 实现分布式资源调度 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装VMware Workstation Pro已安装Windows Server 2008 R2 x64已安装vCenter Server 三、实验步骤 将主机esxi1和esxi2加入…

深圳比创达EMC|EMI电磁干扰行业:行业发展的关键与挑战

在当今的高科技时代&#xff0c;电子产品无处不在&#xff0c;它们为我们的生活带来了极大的便利。然而&#xff0c;随着电子设备的普及和集成度的提高&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题也日益凸显。 一、EMI电磁干扰行业&#xff1a;无处不在的挑战 电磁…

go语言方法之方法声明

从我们的理解来讲&#xff0c;一个对象其实也就是一个简单的赋值或者一个变量&#xff0c;在这个对象中会包含一些方法&#xff0c;而一个方法则是一个一个和特殊类型关联的函数。一个面向对象的程序会用方法来表达其属性和对应的操作&#xff0c;这样使用这个对象的用户就不需…