「C语言」文件的概念与简单数据流的读写函数

写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入、输出。

其实,就算不懂得链表,也完全可以学习”文件“相关知识点,但在此之前最好有”指针“基础。

本篇文章整理自《C语言程序设计教程--人民邮电出版社》第十二章——文件,以作文件探讨。

一、数据流与文件概念

二、文件的打开与关闭

三、文件的顺序读写

四、文件的随机读写

一、数据流与文件概念

1.数据流

数据的输入与输出都必须通过计算机的外围设备,不同的外围设备对于数据输入与输出的格式和方法有不同的处理方式,这就增加了编写文件访问程序的困难程度,而且很容易产生外围设备彼此不兼容的问题。数据流(Data Stream)用来解决这个问题。

数据流将整个文件内的数据看作一串连续的字符(字节),而没有记录的限制。

数据流借助文件指针的移动来访问数据,文件指针目前所指的位置即是要处理的数据,经过访问后文件指针会自动向后移动。

每个数据文件后面都有一个文件结束符号(EOF),用来告知该数据文件到此结束,若文件指针指到EOF便表示数据已访问完毕。

2.文件

“文件”是指存放在外部存储介质(可以是磁盘、光盘、磁带等)上的数据集合。操作系统对外部介质上的数据是以文件形式进行管理的。当打开一个文件或者创建一个新文件时,一个数据流和一个外部文件(可能是一个物理设备)相关联。

C语言支持的是流式文件,即前面提到的数据流,它把文件看作一个字节序列,以字节为单位进行访问,没有记录界限,即数据的输入和输出的开始和结束仅受程序控制,而不受物理符号(如回车换行符)控制。

可以从不同角度对文件进行分类

(1)根据文件依附的性质——普通文件和设备文件。

(2)根据文件的组织形式——顺序读写文件和随机读写文件。

(3)根据文件的存储形式——ASCII码文件和二进制文件。

ASCII码文件和二进制文件的主要区别:

(1)存储形式:ASCII文件将该数据类型转换为可在屏幕上显示的形式存储,二进制文件是按该数据类型在内存中的存储形式存储的。

(2)存储空间:ASCII所占空间较多,而且所占空间大小与数值大小有关。

(3)读写时间:二进制文件读写时需要转换,造成存取速度较慢。ASCII码文件则不需要。

(4)作用:ASCII码文件通常用于存放输入数据及程序的最终结果。二进制文件则不能显示出来,用于暂存程序的中间结果。

在C语言中,标准输入设备和标准输出设备是作为ASCII码文件处理的,它们分别称为标准输入文件和标准输出文件。

文件和内存的交互处理

二、文件的打开与关闭

要打开指定的文件可使用fopen()函数

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

其中第二个参数mode用来设定要打开的文件类型和指定文件的访问模式。

文件中的访问模式:

判断文件是否正确打开

FILE *fp;
fp=fopen("文件目录","文件中的访问模式");
if(fp==NULL)
{
    printf("\n不能打开该文件!");
    getch();
    exit(1);
}

关闭文件使用fclose()

int fclose(FILE *fp);

返回值为0则表示关闭成功,若返回非0值则表示有错误发生。

由系统打开的标准设备文件,系统会自行关闭。

获取文件的属性:

获取文件描述字:int fileno(FILE *fp);

根据文件描述字获取对应文件大小:long filelength(int handle_no);

三、文件的顺序读写

顺序读写是指将文件从头到尾逐个数据读出或写入。

单字符读写函数:fgetc()和fputc():

int fgetc(FILE *fp);

功能为:读取文件指针fp目前所指文件位置中的字符,读取完毕,文件指针自动往下移一个字符位置,若文件指针已经到文件结尾,返回-1。

返回值:成功则返回读取到的字符,失败返回-1.

fgetc()函数调用中,读取的文件必须是以读或读写的方式打开的。

int fputc(char ch,FILE *fp);

功能为:把字符ch写入文件指针fp所指向文件的位置。

返回值:成功时返回字符的ASCII码,失败时返回EOF(在stdio.h中,符号常量EOF的值等于-1)。

被写入的字符可以用写、读写、追加方式打开。

字符串读写函数:fgets()和fputs():

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

功能为:在文件指针fp所指文件位置读取n个字符并放入str字符数组。

返回值:如果读不到字符串时返回NULL。

int fputs(char *str,FILE *fp);

功能为:将字符串str写入文件指针fp所指文件的位置。

返回值:写入数据成功时返回非0值,写入失败时返回EOF。

格式化字符串读写函数:fscanf()和fprintf():

int fscanf(FILE *fp,"格式化字符串",【输入项地址表】);

功能为:从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送到输入项地址表中。

返回值:读取数据成功返回所读取数据的个数,并将数据按照指定格式存入内存中的变量或数组中,文件指针自动向下移动。读取失败返回EOF。

int fprintf(FILE *fp,"格式化字符串",【输入项地址表】);

功能为:将输出项表中的变量值按照格式字符串制定的格式输出到文件指针fp所指向的文件位置。

返回值:成功返回输出字符数,失败则返回负值。

数据块读写函数:fread()和fwrite:

int fread(void *buffer,int size,int count,FILE *fp);

功能为:从文件指针fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。

返回值:该函数的返回值是实际读取的count值。

int fwrite(void *buffer,int size,int count,FILE *fp);

功能为:从buffer所指向的内存区开始,一次输出size个字节,重复count次,并将输出的数据放入fp所指向的文件中,同时将读写位置指针后移size*count次。

返回值:返回实际写入的数据项个数count。

四、文件的随机读写

时间: 2024-10-05 05:02:09

「C语言」文件的概念与简单数据流的读写函数的相关文章

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

「C语言」Windows+EclipseCDT下的C语言开发环境准备

之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Clion等IDE/编辑器搭建C语言开发环境,但也只是点到为止的介绍,对每一个开发环境的选择没有详细的步骤与过程: 这次借助C语言期末课程设计文档上介绍用Eclipse开发C语言的时机,逐步图文论证如何用Eclipse从安装到输出自己的第一个C语言Hello World: 欢迎探讨,欢迎互粉: 目录:

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

「C语言」「例题」结构体与共用体

本篇收集<C语言程序设计教程>第九章“结构体与共用体”的所有例题. 1 #include <stdio.h> 2 3 /*输入一个学生的基本信息, 4 包括学号.姓名.性别.年龄.出生日期.三门成绩, 5 输出该学生的基本信息和平均成绩*/ 6 7 struct date 8 { 9 int year;/* 年份 */ 10 int month;/* 月份 */ 11 int day; /* 日期 */ 12 }; 13 14 struct student 15 { 16 char

「C语言」「例题」数组

本篇收集<C语言程序设计教程>第七章“数组”的所有例题. 每个题中有两种以上解决方法的在该程序中以main2().main3()函数表示.  7.1 10个成绩根据出现次数来排序  7.2 定义一个由整数组成的数组,求出其中奇数的个数和偶数的个数,并打印  7.3 含有5个元素的数组的输入输出和最值  7.4 数组的冒泡排序法  7.5 根据出现次数对10个成绩排序  7.6 二维数组计算两个矩阵MA和MB之差,将结果存储在MA中  7.7 一个2行3列的矩阵的转置(行和列元素互换)  7.8

「易语言」主题颜色配置方案

废话不多说直接上预览图: [舒适护眼方案] [夜晚暗色方案] Ps:大家反馈我,说我写的文章废话太多,我只想说那个易语言故事的那个随笔,不是说我废话多,那个就是讲故事的,类似于作文,所以不要喷我了.我干货方面干起来,可是超乎你的想象的! [下载附件如下] https://files.cnblogs.com/files/MuQuanyu-YuGod/护眼&暗色配色主题.zip 老爷们能来条评论,和推荐吗? 原文地址:https://www.cnblogs.com/MuQuanyu-YuGod/p/

「C语言」「算法」访问数组的多种方式

1 #include <stdio.h> 2 3 //分别用数组名和指针变量,以下标法和指针法输入和输出数组的所有元素 4 5 int main(){ 6 int i=0; 7 int array[6]; 8 int *p=array; 9 printf("\n Please input array[6]: \n"); 10 while(p<(array+6)) 11 scanf("%d",p++); 12 printf("\n Outp

「C语言」「算法」根据三边判断三角形类型

1 #include <stdio.h> 2 3 //根据三边长判断是否能组成三角形,分别以边长和角度看能组成什么三角形 4 5 int main(){ 6 int a,b,c; 7 printf("请输入三边的长,并以逗号隔开:\n"); 8 scanf("%d,%d,%d",&a,&b,&c); 9 if(a<=0 || b<=0 || c<=0){ 10 printf("请输入正数");

「C语言」「算法」输出指定范围内的素数

#include <stdio.h> //输出指定范围内的素数 int main(){ int a,b; int i,j; printf("请输入整数范围并用空格隔开:\n"); scanf("%d%d",&a,&b); for(i=a;i<=b;i++){ for(j=2;j<=i-1;j++) { if(i%j==0) break; } if(j>=i-1) printf("%d ",i); }