【C语言】文件操作

文件类型

在程序设计中,一般文件分为两类:程序文件数据文件

  • 程序文件:包括源程序文件(.c),目标文件(.obj),可执行程序(.exe)
  • 数据文件:内容不一定是程序,如txt文本文档等等

在此我们讨论的是对于数据文件的操作。

文件名

文件名是文件的唯一标识,包含三个部分:文件路径+文件名主干+文件后缀

二进制文件和文本文件

这两种都是文件数据的组织形式。

  • 二进制文件:数据在内存中以二进制的形式存储,不加转换的输出到外存
  • 文本文件:以ASCII字符形式存储

字符在文件中一律以ASCII形式存储,而数值型数据既可以用ASCII形式存储,也可以用二进制方式存储。

流是一个抽象出来的概念,将数据比作源源不断的河流,我们可以从流的任意位置读取数据。

标准流

C语言程序启动的时候,默认打开了三个流:

  • 标准输入流(stdin):在大多数环境下从键盘输入
  • 标准输出流(stdout):大多数环境下输出至显示器界面
  • 标准错误流(stderr):大多数环境下输出至显示器界面

文件指针

以上三个流的类型是FILE*,叫做文件指针
文件类型是一个结构体,在VS2013中有以下定义:

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

打开文件时,系统会根据文件自动创建一个这样的FILE变量。我们可以创建一个FILE*类型的指针变量指向这个FILE变量,而FILE类型的这个结构体中又有一个指针指向这个文件,从而达到间接维护这个文件信息的目的。

在这里插入图片描述

文件读写

文件的打开与关闭

在这里插入图片描述

这里fopen的第一个参数是文件名,第二个是打开方式

关闭文件只需要传入文件指针即可

//打开文件
FILE* pf = fopen("sample.txt", "w");
//关闭文件
fclose(pf);
pf = NULL;//关闭文件之后pf就成了野指针!!
模式含义如果要打开的文件不存在
r(只读)为了读取数据,打开一个已经存在的文本文件出错
w(只写)为了写入数据,建立一个文本文件(若存在同名文件则先清空再写入)建立一个新文件
a(追加)向文本文件末尾添加数据建立一个新文件
rb(只读)为了读取数据,打开一个已经存在的二进制文件出错
wb(只写)为了写入数据,建立一个二进制文件建立一个新文件
ab(追加)向一个二进制文件末尾添加数据建立一个新文件
r+(读写)为了读写数据,打开一个文本文件出错
w+(读写)为了读写数据,建立一个文本文件建立一个新文件
a+(读写)打开一个文件,在文件末尾读写建立一个新文件
rb+(读写)为了读写数据打开一个已经存在的二进制数据出错
wb+(读写)为了读写数据,建立一个新的二进制文件建立一个新文件
ab+(读写)打开一个二进制文件,在文件末尾读写建立一个新文件

文件读写函数

函数名功能适用于参数返回值
fgetc字符写入所有输入流FILE* stream(int)写入的字符/EOF
fputc字符读取所有输出流int character, FILE* stream(int)写入的字符/EOF
fgets文本行写入所有输入流char* str, int num, FILE* stream(char*)字符串指针/EOF
fputs文本行读取所有输出流const char* str, FILE* stream(int)非负值/EOF
fscanf格式化写入所有输入流FILE* stream, const char* format, …(int)成功写入字符数/EOF
fprintf格式化读取所有输出流FILE* stream, const char* format, …(int)成功读取字符数/EOF
fread二进制读取文件void* ptr, size_t size, size_t count, FILE* stream(size_t)成功读取元素个数/EOF
fwrite二进制写入文件const void* ptr, size_t size, size_t count, FILE* stream(size_t)成功写入元素个数/EOF
sscanf格式化写入字符串const char* s, const char* format, …(int)成功转化字符串的数量/EOF
sprintf格式化读取字符串char* str, const char* format, …(int)输出的字符数/EOF

文件随机读写

  • fseek:根据文件指针的位置和偏移量定位
int fseek(FILE* stream, long int offset, int origin)

其中offset是偏移量,往后走n个字符就是n,往前走要加负号

origin的格式有三个,SEEK_SET, SEEK_CUR, SEEK_END
在这里插入图片描述
文件每读一次,指针就会往后偏移一个字符,所以指针当前可能不在起始位置

  • ftell:用来查找文件指针在当前文件的位置(相对起始的偏移量)
long int ftell(FILE* stream)
  • rewind:用来使文件指针返回起始位置
void rewind(FILE* stream)

文件读取结束的判定(feof、ferror)

这两个函数并不能用来判断文件有没有被读取完毕;而是等文件读取结束后,判断结束的原因是读完了正常退出还是出错异常退出

FILE* fp = NULL;
//......读取文件......
if(feof(fp))
   printf("正常读取结束");
if(ferror(fp))
   printf("异常读取中止");
fclose(fp);
fp = NULL;

文件缓冲区

程序在写入到硬盘或者从硬盘中读取数据时,都会先经过一个缓冲区,然后缓冲区的数据再逐个进入目标区域。

用一段代码来测试文件缓冲区的存在:

#include<stdio.h>
#include<windows.h>

int main()
{
   FILE* pf = fopen("test.txt", "w");
   fputs("abcdef", pf);//数据abcdef放在缓冲区
   printf("已将数据放入缓冲区");
   
   Sleep(10000);//程序休眠十秒,查看文件里并没有数据
   fflush(pf);//刷新缓冲区,数据输出到文件中
   printf("缓冲区中的数据写入文件");
   
   Sleep(10000)//消除fclose刷新缓冲区的影响
   fclose(pf);
   pf = NULL;

   return 0;
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值