最近学习了在c语言中对文件的处理(此为win10操作系统),由根据《c标准库》一书针对文件处理相关函数进行了一些总结

在这里只总结了<stdio.h>头文件内的函数,头文件<stdio.h>声明了很多执行输入输出的函数,在阅读各个函数的定义即作用之前,章节前对于stdio.h的历史追朔让我很感兴趣,甚至感觉 了解语言是如何进化统一的比了解函数语句是如何操作的更加重要,现将一部分内容节选出来分享一下:

在20世纪60年代早期,FORTRAN IV被认为是独立于机器的语言。但是如果不作任何改动,根本不可能在各种计算机体系结构中移动FORTRAN IV程序。可移植性的主要障碍是输入输出领域。在FORTRAN IV中,可以对FORTRAN IV代码中间的I/O语句中对正在通信的设备进行命名。CARD 和 INPUT TAPE就不一样。

之后,逐渐发展到使用逻辑单元号(LUN)来代替具体的设备名,从而在可执行的二进制卡片之前加入控制卡片,从而指定某个特殊的运行过程那些设备与特定的LUN相对应。这时候,独立于设备的I/O时代来临了。

设备独立的进一步改善得益于标准外围交换程序(peripheral interchange program,PIP)的进步。该程序允许指定源设备与目标设备的任意成,然后尽力执行两个设备之间的拷贝操作。

进入UNIX。UNIX对所有文本流采用了标准内部形式,文本的每一行以换行符终止。这正是程序读入文本时所期望的,也是程序输出所产生的。假如这样的约定不能满足和UNIX机器相连的处理文本的外围设备的需求,可以在系统的对外接口有些修改,不必修改任何内部代码。UNIX提供了两种机制来修正“对外接口”的文本流。首先的是一个通用的映射函数,它可以用任意的文本处理设备工作。可以用系统调用ioctl来设置或者测试一个具体设备的的各种参数。另一个修正文本流的机制是修改直接控制该设备的专门软件。对于每一个UNIX可能需要控制的设备来说,用户必须添加一个常驻UNIX的设备管理器。

当第一个C编译器在UNIX平台上运行时,C语言就自然地继承了它的宿主操作系统简单的I/O模型。除了文本流的统一表示,还有其他一些优点。很久以前使用的LUNs在最近几十年也慢慢地演变为称为文件描述符或句柄的非常小的正整数。操作系统负责分发文件描述符。并且把所有的文件控制信息存储在自己的专用内存中,而不是让用户去分配和维持文件和记录控制块以加重负担。

为了简化多数程序的运行管理,UNIX shell分配给每个运行的程序3个标准文件描述符,这些就是现在普通使用的标准输入、标准输出和标准错误流。(文本流)

UNIX不会阻止向任意打开的文件写入任意的二进制编码,或者从一个足够大的地方把它们丝毫不变地读取出来。(二进制流)

所以,UNIX消除了文本流(与人通信)和二进制流(与机器通信)之间的区别。

在相同的实现下,从一个二进制流读入的数据应该和之前写入到这个liu的数据相同,而文本流则不是。

PS:流是一个操作系统层面的高度抽象的概念,它隐藏了I/O设备具体的实质,而将所有的I/O带来的数据变化看做输入的流入和流出,这样,在操作系统层面为程序将各种I/O设备模拟成流的样式,已经使这时的I/O模块独立而抽象了。可以看到,I/O模型发展的过程,就是其逐渐抽象统一的过程,这一点与语言的发展的历程是相似的。

X3J11委员会在1983年开始召开会议为C起草ANSI标准。非UNIX系统的C厂商和那些UNIX用户之间争论了很长时间,因为UNIX用户不能理解I/O为什么要这么麻烦(显然,UNIX的文件结构和设备的管理机制保证了I/O模块的简洁性,这是相对于其他操作系统的优点)。这是一个很有教育意义的过程,这些争论的一个重要的副产品就是更清楚地阐明了C支持的I/O模块。

最终,委员会经过讨论整洁的重要性和向下兼容的重要性之后,决定抛弃UNIX风格的原语。(主要平衡代码效率和代码简洁性)

接下来就看一下相关的实现

FILE    它是一个对象类型,可以记录控制流需要的所有信息,包括它的文件定位符、指向相关缓冲(如果有的话)的指针、记录是否发生了读/写错误的错误提示符和记录文件手否结束的文件结束符(用来控制流的FILE对象的地址可能很重要,不必使用FILE对象的副本来代替原始的对象进行服务。

库中的函数分两类:

1.针对任意流的操作;

2.指定特定问文件流的操作;

两者分别又有读写、文件定位、缓冲区控制等操作,可以完成对流的全方位操作。

文件只为两种形式,字符型文件和二进制型文件

所以不管是何种形式的文件,c语言统一把它当作连续的字节流进行处理,该字节流的信息以及文件对应的文件描述符等都是需要存储在FILE类型中的内容。

源码的定义

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

不需要对内部进行太多的理解,就是各种描述文件的信息,可以当作类似于int类型 一样的类型去使用,只不过是描述文件类型

1.remove(导致一个文件再也不能通过它的文件名进行访问)

 #include<stdio.h>
int main()
{
FILE *pFile;
char *FileName = "D:\\test1.txt";
int n;
int b;
char buff[] = {};
b = remove(FileName);
fopen_s(&pFile,"D:\\test1.txt","r+");
//printf("%s n = %d\n",buff,n); return ;
}

2.rename(类似于重命名)

 #include<stdio.h>
int main()
{
char *pOld = "D:\\love.txt";
char *pNew = "D:\\666.txt";
FILE *pFile;
rename(pOld,pNew); //类似于重命名
fopen_s(&pFile,"D:\\love.txt","r");
return ;
}

3.tmpfile(创建一个二进制的临时文件)

4.fclose(清空流)

5.fopen(打开文件)

6.freopen(关联文件,在编程比赛过程中,如果太过于繁杂的输入数据,可以通过创建txt文件然后关联的方式进行输入,例 a + b)

 #include <stdio.h>
int main()
{
int a,b;
freopen("D:\\in.txt","r",stdin); //输入数据将从in.txt文件中读取
freopen("D:\\out.txt","w",stdout); //输出数据将保存在out.txt文件中
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",a+b);
fclose(stdin);//关闭文件
fclose(stdout);//关闭文件
return ; }

还有一些没有涉及到的函数,在以后使用中继续加入,接下来根据这些函数写两个简单的应用

1.复制字符型文件

#include<stdio.h>
int main()
{
FILE *pFile1;
FILE *pFile2;
char c; fopen_s(&pFile1,"D:\\test2.txt","r");
fopen_s(&pFile2,"D:\\love.txt","w");
while((c = getc(pFile1)) != EOF)
{
putc(c,pFile2);
} return ;
}

2.复制二进制型文件(也是文件传输的雏形)

#include<stdio.h>
int main()
{
FILE *pFile1;
FILE *pFile2;
int n;
char buff[]; fopen_s(&pFile1,"C:\\Users\\cyc\\Desktop\\通讯录-2.png","rb");
fopen_s(&pFile2,"D:\\你猜是啥呀.png","wb"); while((n = fread(buff,,,pFile1))> )
{
fwrite(buff,,n,pFile2);
}
return ;
}

当然这个复制和快捷键 ctrl + c   ctrl + v不同,快捷键是利用剪切板进行复制粘贴的

2019-05-09 11:34:21 编程小菜鸟自我反省,大佬勿喷,谢谢!!!

5-9 c语言之【文件】的更多相关文章

  1. BMP头文件格式以及C语言读取头文件【转】

    BMP头文件格式以及C语言读取头文件[转] (2011-12-24 22:59:17) 转载▼ 标签: 杂谈 分类: 各个领域的知识 BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文 ...

  2. c语言头文件中定义全局变量的问题

    c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...

  3. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

  4. 嵌入式C语言头文件的建立与使用

    如何正确编写 C 语言头文件和与之相关联的 c 源程序文件,这首先就要了解它们的各自功能. 要理解 C 文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程. 一般说来编译器会做以下几 ...

  5. C语言基础文件读写操作

    整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...

  6. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  7. C语言头文件

    最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比 ...

  8. C语言判断文件夹或者文件是否存在的方法【转】

     C语言判断文件夹或者文件是否存在的方法   方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所 ...

  9. C语言程序设计--文件操作

    前言 这里尝试与Python对别的方法来学习C语言的文件操作,毕竟我是Pythoner. 文件打开与关闭 Python #因为是和C语言比对,所以不使用with filename = "/e ...

  10. C++标准库头文件名字和C语言头文件名字的区别

    1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...

随机推荐

  1. 图灵学院java架构课程

    1.wps文档地址 https://docs.qq.com/doc/DRVNLUndvTmFSdEhO 2.百度网盘地址 https://pan.baidu.com/s/1uxaTzJZHKrsw_H ...

  2. 【转载】Hadoop集群各部分常用端口号

    hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集记录如 ...

  3. Apache Flink - 作业和调度

    Scheduling: Flink中的执行资源通过任务槽(Task Slots)定义.每个TaskManager都有一个或多个任务槽,每个槽都可以运行一个并行任务管道(pipeline).管道由多个连 ...

  4. 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础

    1.实践过程记录 1.字符串型注入. 2.整数型注入 3.注入语句查看其他内容 4.xss是一种漏洞,这种漏洞允许用户输入脚本并且浏览器提交的时候不加编码.这种东西是最为流行并且有害的web应用的问题 ...

  5. [Linux] 创建、删除用户

    系统:Ubuntu useradd:创建新用户或更新默认新用户信息 创建新用户 xxx,/home 目录没有同名文件夹,并且此用户没有 shell 权限 $ sudo useradd xxx 创建新用 ...

  6. ML_Homework_Porject_2_LDA_KNN

    第二次机器学习的作业完成了,写一下总结. 作业要求:实现用线性判别分析(LDA,LinearDiscriminantAnalysis)的二分类,用KNN比较LDA和PCA在有监督学习下的分类区别. 开 ...

  7. delphi 解决android 9上无法使用http协议

    delphi 解决android 9上无法使用http协议 安卓9不让客户端通过非https方式访问服务端数据(不允许发送明文http请求)的问题. 解决方法: 1.选择安卓平台编译一次程序,在项目根 ...

  8. AT1357 n^p mod m(洛谷)

    题意翻译 求 n^p mod m 的值 输入格式 一行,为整数 n,m,p(注意顺序) 输出格式 一行,为 n^p mod m 的值 数据说明 对于100%的数据 1≤n,m≤10^91≤n,m≤10 ...

  9. PM2用法简介【命令行启动 --env 参数设置使用问题】

    环境切换 正式开发中分为不同的环境(开发环境.测试环境.生产环境),我们需要根据不同的情景来切换各种环境 pm2通过在配置文件中通过env_xx来声明不同环境的配置,然后在启动应用时,通过--env参 ...

  10. Android高频单词

    Display 显示 Camera 照相机 Bluetooth 蓝牙 Flash Memory 闪存 Audio 音频 Management 管理 SurFace 界面 Media 多媒体 Frame ...