我们所编写的程序源代码以及编译生成的可执行文件都属于文件。所以文件的实质就是存储在外部存储介质上的一段连续的二进制数据。

c 语言程序对文件的处理采用文件流的形式,程序运行在内存中,而文件是存储在外部存储介质上,例如硬盘、U盘等。

一,文件的打开与关闭

在程序运行时,就会在指定的文件之上建立一条管道,当读取文件时,数据就会像流水一样从文件端流向程序端,而写入文件时,数据就会像流水一样从程序端流向文件端。从文件端向程序端的文件流称为输入流,从程序端向文件端的文件流称为输出流。如下图:

只要打开一个文件就会得到一个文件流。有了文件流之后,就可以对文件进行相应的读写操作。

在c语言的标准库中,有一系列和文件相关的库函数,要想使用这些库函数只需要在程序中包含“stdio.h”这个头文件就可以了。

1,文件的打开

打开文件使用的函数为 fopen 函数,该函数原型为:

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

fopen函数的返回值是一个文件流,其实就是一个FILE结构体类型的指针。这个结构体变量中包含了文件的名称、大小、属性等相关信息;若执行失败,则返回空指针。

下面举一个用fopen函数来打开文件的例子:

FILE *pfile=fopen("D:\\test.txt","r");//以“r”只读模式打开D盘下的test.txt文件
if(pfile!=NULL)
printf("File opened successfully.\n");
else
printf("Failed to open file.\n");

同时也需注意,“D:\test.txt" 使用的是绝对路径,由于斜杆

" \ "在c语言中作为转义字符来使用,因此必须使用" \ \ " ,才能表示一个斜杠字符本身。

2,文件的关闭

关闭文件使用"fclose"函数,函数原型如下:

int fclose(FILE *stream);

fclose 函数的功能就是将该函数所指定的文件流关闭。函数的返回值为int 类型,当函数执行成功,返回整型值1,当函数执行失败,返回一个EOF(文件终点),通常定义为-1.

二,文件的读写

打开文件、创建文件流的主要目的是对文件进行数据的读取或数据的写入。下面列举几个和文件读写相关的库函数及其应用实例。

1,以字符的方式读写文件

标准库提供的fgetc函数和fputc 函数,以字符的方式对文件进行读写操作。

案例:编写程序,将“I love you” 以字符的方式写入D盘的test.txt文件中。代码如下:

#include<stdio.h>
int main(){
char str[]="I love you";
FILE *pfile=fopen("D:\\test.txt","w");
if(pfile){
char *ptmp=str;//临时指针,指向数组str的首字符
while(*ptmp){ //对ptmp解引用,检查指向的字符是否为空字符
fputc(*ptmp,pfile); //将ptmp指向的字符写入pfile关联的文件
++ptmp; //移动指针,指向数组中下个字符
}
fclose(pfile); //关闭文件
puts("Write to complete.");
}
else
puts("File opening failed.");
return 0;
}

以字符的方式读取D盘test.txt文件中的内容,将其存储到字符数组中,并打印输出,程序如下:

#include<stdio.h>
int main(){
char buf[128]; //字符数组
FILE *pfile=fopen("D:\\test.txt","r"); //以只读模式打开
if(pfile){
char *p=buf; //指向数组的首地址的指针p
while((*p=fgetc(pfile))!=EOF)//从文件读取一个字符并存储到数组中
++p; //移动指针
*p='\0'; //将数组中的EOF字符修改为空字符
fclose(pfile);
printf("The read content is:%s\n",buf);
}
else
puts("File opening failed.");
return 0;
}

2,依行的方式读写文件

fgets函数和fputs函数,可以非常方便的对文本文件进行一行字符的读取或写入。

案例:编写程序,将“I love you” 以行的方式写入D盘的test.txt文件中。代码如下:

#include<stdio.h>
int main(){
FILE *pfile=fopen("D:\\test.txt","w");
if(pfile){
if(fputs("I love you",pfile)!=EOF)
printf("File writen successful.\n");
else
printf("Failed to write file.\n");
fclose(pfile);
}
else
printf("File opening failed.\n");
return 0;
}

若将“I love you” 以行的方式读取D盘的test.txt文件。代码如下:

#include<stdio.h>
int main(){
char buf[128]; //字符数组
FILE *pfile=fopen("D:\\test.txt","r");
if(pfile){
if(fgets(buf,128,pfile))
printf("The read contend is:%s\n",buf);
else
printf("Failed to read file.\n");
fclose(pfile);
}
else
printf("File opending failed.\n");
return 0;
}

上面这两种方式的写入和读取方式已经给出了完整的代码,可以自行选择性的复制到本地自行验证并体会

一般情况下,文件的操作我们平时用的比较少,所以一些其他的高阶操作我们就得在实际应用中去学习—— 需要用到某个知识点,我们就立即去学习它就行了,完全没必要把所有的知识都学完了在去应用!

如何系统学习C 语言(下)之 文件篇的更多相关文章

  1. 如何系统学习C 语言(上)之 基础篇

    大话C 语言(一) 初识C 语言 老实说,上大学之前我根本不知道什么是C 语言,所以当初学校开设这门课时,我是充满了好奇,所以当初我翻阅了大量的C 语言入门书籍,千篇一律,都是从一些概念.术语和理论讲 ...

  2. 系统学习 javaweb2----HTML语言2

    感想:学习javaweb之路,任重而道远. 学习笔记: 5.表格标签 5.1<table></table> 表格标签,用于效果中定义一个表格 5.2<tr>< ...

  3. 如何系统学习C 语言(下)之 预处理命令篇

    大话c语言(下)之 预处理命令篇 预处理就是在编译之前,通过一些预处理命令对源代码进行管理和控制的过程. 由源代码得到可执行的程序,会经过预处理.编译.汇编和链接几个过程 预处理命令大致可以分为文件包 ...

  4. 系统学习javaweb1----HTML语言1

    自我感受:HTML语言没想到也有这么大的学问,竟然能通过超链接标签直接访问百度,这可让我大吃一惊,我也得反思一下自己,上学期的java纯是混过来的,没有系统的学习过,感觉能通过期末考试都是侥幸,接下来 ...

  5. 从入门到掌握 - 系统学习shell语言

    简介 什么是 shell Shell是一种程序或命令行解释程序,用于解释用户直接输入的用户命令或从文件中读取的用户命令,然后将 它们传递给操作系统以进行操作或处理.要注意,这个过程是解释而不编译脚本, ...

  6. linux(centos 7)学习之 ~目录下的文件anaconda-ks.cfg

    这个文件是记录安装系统的一些信息 #version=DEVEL # System authorization information auth --enableshadow --passalgo=sh ...

  7. 系统学习javaweb3----HTML语言3(结束)

    说明:昨天是北方小年,需要做的事情有点多,需要祭灶,扫尘.包饺子,吃糖瓜儿,学习时间有点少,所以今天将两天的知识综合一下发出. 自我感觉:虽然感觉大致都了解了HTML语言,但是感觉自己面对程序还是无从 ...

  8. 如何系统学习C 语言(中)之 指针篇

    谈到指针,我们可能会想到钟表上的指针,但这里的指针不是现实生活中看得见摸得着的钟表上的指针,c 语言中的指针只存在于逻辑思维中,物理上并不存在. 同时,指针也是C 语言中最精华的部分,通过灵活地运用指 ...

  9. 如何系统学习C 语言(中)之 结构体篇

    1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...

随机推荐

  1. P3343-[ZJOI2015]地震后的幻想乡【dp,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P3343 题目大意 给出\(n\)个点的一张无向图,每条边被修复的时间是\([0,1]\)的一个随机实数,求这张图联 ...

  2. P3335-[ZJOI2013]蚂蚁寻路【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3335 题目大意 给出\(n\times m\)的网格,每个格子有权值.一个回路在格子的边上,要求有\(2\tim ...

  3. CRM是什么,你有认真了解过CRM吗?

    这是CRM的一个简单定义 客户关系管理 (CRM)是一种用于管理公司与客户和潜在客户的所有关系和互动的技术.目标很简单:改善业务关系.CRM 系统可帮助公司与客户保持联系.简化流程并提高盈利能力. 当 ...

  4. Linux命令行:监视系统IO、内存、CPU、GPU

    [监视IO] Linux18.04自带工具sysstat,其中的iostat可以用于观察IO情况.Linux16.04系统没有默认安装,需要手动安装,安装sysstat时需要下载新的内核(我的原本是1 ...

  5. C语言数组的创建和使用

    C语言数组的创建和使用 数组是一组相同类型元素的集合. 一维数组的创建及初始化 //创建int类型的数组 //直接创建:不对数组进行初始化 int arr1[10]; //最常用.好用的创建方式 in ...

  6. MD5加密算法的实现方式

    MD5加密算法 MD5在我们平时项目中运用比较多,尤其是在用户注册的时候,密码存入数据库时可以利用MD5算法加密后存入,可以保证数据的安全性. 代码实现 public final class Md5U ...

  7. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

  8. react之组建通信

    父组件与子组件通信 父组件将自己的状态传递给子组件,子组件当做属性来接收,当父组件更改自己状态的时候,子组件接收到的属性就会发生改变 父组件利用ref对子组件做标记,通过调用子组件的方法以更改子组件的 ...

  9. 北鲲云超算如何让仿真技术、HPC和人工智能之间的深度融合?

    在CAE领域,随着仿真技术在多个行业的深度应用,也带来了仿真模型日益复杂.仿真过程数据倍增.仿真计算费用昂贵等问题,降阶模型.人工智能.云计算等多种技术和仿真技术的深度融合,成为了仿真技术的重要发展趋 ...

  10. v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码

    子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...