函数库查找链接:C 标准库 – 参考手册 | 菜鸟教程


文章目录

  • 文件类型
  • C语言有关文件函数
  • 文件缓冲区
  • 总结

前言

文件是硬盘储存数据内容必不可少的一部分,所以文件相关知识我们应当有所认知并熟练使用相关文件函数实现代码编译文件,读取文件。


一、文件类型

1.文件名

例如 C:\code\test.txt

2.文件类型

文件分为程序文件(.c .obj .exe等等) 和 数据文件(txt)

后缀名称决定了其类型和默认打开方式

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文
本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
简单来说二进制文件我们看不懂,文本文件我们看的懂

二、C语言有关文件函数(输入、输出流)

1.打开关闭函数fopen fclose

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

int fclose (FILE * stream)

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

2.(所有输入输出)单个字符文件函数fgetc fputc

  int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。(所有输出流)

int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。读取失败了返回EOF(所有输入流)

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("test.txt");}//输出一个字符到文件fputc('a', pf);//读取一个字符int ch=fgetc(pf);printf("%c\n", ch);fclose(pf);return 0;
}

3.(所有输入输出)字符串文件函数 fputs,fgets

int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。该函数返回一个非负值,如果发生错误则返回 EOF

char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

返回值:如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针

#include<stdio.h>
int main()
{char str[20];int i = 0;FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("test.txt");}//输出字符串到文件fputs("hello world", pf);//读取字符串到字符数组fgets(str, 12, pf);printf("%s\n", str);fclose(pf);return 0;
}

4.格式化输入函数fscanf 输出函数 fprintf

 int fprintf(FILE *stream, const char *format, ...) 发送格式化输出到流 stream 中。如果成功,则返回写入的字符总数,否则返回一个负数。

int fscanf(FILE *stream, const char *format, ...) 从流 stream 读取格式化输入。如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF

#include<stdio.h>
int main()
{char str[20]="hello world!";char tmp[20];int i = 0;FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("test.txt");}//将str数组中字符串输出到pf所指向文件中fprintf(pf, "%s", str);//将pf文件中内容以格式化输出到数组tmp中fscanf(pf, "%s", tmp);//打印内容printf("%s\n", tmp);return 0;
}

补充两个函数 sscanf sprintf(格式化<——>字符串)

简单来说就是输出输入流变成存字符串的数组

int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。

int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。

5.二进制输出输入文件函数 fread fwrite

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。

返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

  • ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
  • size -- 这是要读取的每个元素的大小,以字节为单位。
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流

​​​​​​​size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中

返回值:成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

#include<stdio.h>
struct str
{char name[10];int age;float score;
};
int main()
{struct str buffer;struct str str= { "张三",20,70.5f };FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("test.txt");}//先输出到文件fwrite(&str, sizeof(str), 1, pf);//从文件中输入到结构体buffer中fread(&buffer, sizeof(str), 1, pf);//打印printf("%s %d %4.2f",buffer.name,buffer.age,buffer.score);return 0;
}

6.文件指定位置读取内容相关函数( fseek ftell rewind)

int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • offset -- 这是相对 whence 的偏移量,以字节为单位。
  • whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

注意:如果选择末尾为起始位置,那么前面字符偏移量相当于末尾是负数。

long int ftell(FILE *stream) 返回给定流 stream 的当前文件位置。

 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文件的开头。

#include <stdio.h>int main ()
{FILE *fp;fp = fopen("file.txt","w+");fputs("This is runoob.com", fp);fseek( fp, 7, SEEK_SET );fputs(" C Programming Langauge", fp);fclose(fp);return(0);
}

很明显我们发现第二次输出字符串起始插入地址变为 is 以后 说明fseek成功让文件指向指定偏移量处。

7.文件读取结束的判定函数 feof ferror

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
这些函数前面详细写过,忘记可以翻看!

int feof(FILE *stream) 测试给定流 stream 的文件结束标识符。如果返回值为真,则说明读取到末尾结束,否则为读取错误导致结束读取

int ferror(FILE *stream) 测试给定流 stream 的错误标识符。如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。

简单来说文件结束原因要不是错误,要不是已经完全读取到末尾,上面两个函数非此即彼。两个返回值一定有一个为真。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar(c);
}//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
return 0;
}

三、文件缓冲区

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

#include <windows.h>
//VS2013 WIN10环境测试
int main()
{
FILE*pf = fopen("test.txt", "w");
fputs("abcdef", pf);//先将代码放在输出缓冲区
printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
Sleep(10000);
printf("刷新缓冲区\n");
// int fflush(FILE *stream) 刷新流 stream 的输出缓冲区fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)//注:fflush 在高版本的VS上不能使用了
printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
Sleep(10000);
fclose(pf);
//注:fclose在关闭文件的时候,也会刷新缓冲区
pf = NULL;
return 0;
} 

四、总结.

文件这一节内容上并不难,但是有很多函数需要我们熟练它们,愿大家能静下心来自己写一写这些函数用法,以后遇到游刃有余!

C语言文件重点知识总结(冲冲冲)相关推荐

  1. C语言 文件基础知识整理

    C语言文件基础知识 之前学C语言的时候老师讲文件讲的相当潦草,因为大作业的关系现在只能自己重听自学一遍.以下是根据北理工的C语言程序设计mooc的文件单元课件和上课时的补充内容所整理的C语言文件基础知 ...

  2. linux C语言 文件相关知识01

    ps:文件描述符表,与文件指针 有什么联系??? 1. linux 系统,一般一个进程 允许打开的最大文件数量是 1024, 对应内核区的进程控制块(pcb)中的文件描述符表的范围, 在shell输入 ...

  3. C语言文件有关的基本知识,以及函数打开与关闭文件!

    " 要成为绝世高手,并非一朝一夕,除非是天生武学奇才.但是这种人-万中无一 " -- 包租婆 ● C语言文件有关的基本知识 01  什么是文件 1.文件有不同的类型,在程序设计中, ...

  4. python语言可以处理数据文件吗_Python语言读取Marc后处理文件基础知识.pdf

    Python语言读取Marc后处理文件基础知识 基于 python 的焊接后处理 知识要点:  Python 语言  Python 模块功能  PyPost 后处理模块  PyPost 模块函 ...

  5. 计算机二级c语言公共基础知识重点,计算机二级C语言公共基础知识与考点汇总...

    计算机二级C语言公共基础知识与考点汇总 计算机二级公共基础知识总结 计算机二级公共基础知识总结 第一章 数据结构与算法 1.1 算法 算法是指解题方案的准确而完整的描述. 算法的基本特征:是一组严谨地 ...

  6. 自学c语言中相关知识,设计出医院住院管理系统.要求如下所述:,C语言课程设计题Z目.doc...

    C程序课程设计 题目及任务 设计题目.任务 从以下三个题目中任选一个 题目一:汽车售票系统 任务:自学C语言中相关知识,设计出汽车售票系统.要求如下所述: 每天"武汉火车站→天河机场&quo ...

  7. C语言有四种基本常量,第2章-C语言的基础知识.ppt

    第2章-C语言的基础知识.ppt 第二章 编制C程序的基础知识,本章重点内容 2.1 常量与变量 2.2 C语言的基本数据类型 2.3 C语言的常用运算符和表达式,运行程序,第二章 编制C程序的基础知 ...

  8. ajax心得体会论文,AJAX重点知识的心得体会

    下面就为大家带来一篇 AJAX重点知识的心得体会.学习还是有点帮助的,给大家做个参考吧. AJAX是什么? 是Asynchronous Javascript And XML的首字母的缩写, 它不是一门 ...

  9. 史上最全JVM重点知识总结

    史上最全JVM重点知识总结 基于<深入了解java虚拟机>相关章节进行地重点知识归纳,同时面向企业面试,给出常见面试问题解析及自己的见解,如果有不正确的地方欢迎大佬们指正. 文章目录 1. ...

最新文章

  1. 软件工程 软件的估计为什么这么难
  2. SVN更新后显示的U与G是什么意思?
  3. 如何自定义SAP Spartacus店铺的界面颜色风格
  4. 记录一次react项目配置过程
  5. C++:extern关键字
  6. adb连接手机出现Connection refused
  7. OpenCV摄像头标定
  8. 计算机学院实验室安全管理办法,计算机科学学院实验室安全管理制度
  9. 网易有道词典识别不了adobe打开的pdf
  10. Android绘制优化(二)布局优化
  11. 不属于计算机主机设备的是什么,不属于计算机硬件的是什么
  12. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(三)
  13. KONICA MINOLTA 423SeriesPS-8打印机驱动
  14. 微信小程序入门-音乐播放器
  15. 【子桓说】某大学毕业生:我很嫉妒月入10万的网红
  16. TextView相关
  17. 不,压缩包密码忘记(没有网盘提取码)你还有希望
  18. c#求长方形的面积周长公式_C#语言-输入三角形或者长方形边长,计算其周长和面积并输出...
  19. 自媒体矩阵搭建教程!
  20. ASEMI整流桥KBPC1510的型号数字代表什么

热门文章

  1. 2023最强Docker教程
  2. LT7688 Uart TFT 串口屏控制芯片
  3. MDN之Web 开发技术【Object.assign()】
  4. echarts:Cannot read property '0' of undefined / coords[i] is undefined / a[o] is undefined
  5. 您的计算机出现了页面配置问题,由于启动计算机时出现了页面配置问题【处置方案】...
  6. NLP自然语言处理中的文本相似度
  7. 3个递推和递归题目:紧密数、排队问题、表达式计数
  8. 阿里某新员工吐槽:来了两个月非常想离职,会不会被阿里拉黑?
  9. Nodejs: TypeError: The super constructor to “inherits“ must not be null or undefined
  10. Android_常用控件