十五、文件

关于C语言如何做文件和底层操作的。

文件操作,从根本上说,和C语言无关。这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数操作文件,最基本的最原始的文件操作。

你需要理解,我们在这部分所学习的,是函数库的使用,而非C语言。

顺便我们还学习了很多和计算机相关的知识,比如重定向、文本文件和二进制文件的江湖恩怨。

但是既然不是C语言,也就意味着你将来的工业环境下,未必还会使用这么原始的文件操作函数了。这些函数,只是一个标本,让你知道可以这样来操纵文件。但是,不见得所有的库都是以这样的方式来操纵文件的。

围绕文件操作,还有一个C语言受时代局限,处理得不够好的东西,就是错误处理。因为文件操作的每一个步骤都很可能在实行过程中遇到问题:文件打不开啦,读了一半出错啦,等等等等,所以设计文件操作函数如何反馈和处理这类运行时刻的问题是需要很好的手段的。C的这个函数库,主要是通过特殊的返回值来实现的。后来的语言,如C++和Java,则引入了异常机制来处理这些事情。

关于底层操作,我们主要是介绍了按位操作,包括按位的运算、移位和位段。这些操作在日常程序中难得遇到,主要是用于接触硬件的底层程序的。

 

格式化输入和输出

(1)printf
%[flags][width][.prec][hlL]type

 

(2)scanf
%[flag]type

 

 

文件输入和输出

用 > 和 < 做重定向
输入结束

(1)getchar读到了EOF

(2)scanf返回小于要求读的数量

FILE

FILE* fopen (const char* restrict path, const char * restrict mode);
int fclose(FILE *stream);
fscanf(FILE*, ...);
fprintf(FILE*,..);
打开文件的标准代码
FILE*  fp=fopen("file","r");
if(fp) {
   fscanf(fp, ...);
   fclose(fp);
}else{
   ....
}

二进制文件

(1)其实所有的文件最终都是二进制的

(2)文本文件无非是用最简单的方式可以读写的文件

——more、tail

——cat

——vi

(3)而二进制文件是需要专门的程序来读写的文件

(4)文本文件的输入输出时格式化,肯经过转码

文本vs二进制

——Unix喜欢用文本文件来做数据存储和程序配置

(1)交互式终端的出现使得人门喜欢用文本和计算机“talk”

(2)Unix的shell提供了一些读写文本的小程序

——Windows喜欢用二进制文件

(1)DOS是草根文化,并不继承和熟悉Unix文化

(2)PC刚开始的时候能力有限,DOS的能力更有限,二进制更接近底层

——文本的优势是方便人类读写,而且跨平台

——文本的缺点是程序输入输出要经过格式化,开销大

——二进制的缺点是人类读写困难,而且不跨平台

int的大小不一致,大小端的问题....

——二进制的优点是程序读写快

程序为什么要文件

——配置

(1)Unix用文本,Windows用注册表

——数据

(1)稍微有点量的数据都放在数据库了

——媒体

(1)这个只能是二进制的

——现实是,程序通过第三方库来读写文件,很少直接读写二进制文件了

二进制读写
size_t fread(void *restrict ptr, size_t size,size_t nitems, FILE *restrict stream);
size_t fwrite(void *restrict ptr, size_t size,size_t nitems, FILE *restrict stream);

——注意FILE指针是最后一个参数;

——返回的是成功读写的字节数。

为什么nitem?

——因为二进制文件的读写一般都是通过对一个结构变量的操作来进行的

——于是nitem就是用来说明这次读写几个结构变量!

在文件中定位
long ftell(FILE *stream);
int fseek(FILE *stream, long offset, int whence);
SEEK_SET    //从头开始

SEEK_CUR    //从当前位置开始

SEEK_END    //从尾开始(倒过来)
可移植性

——这样的二进制文件不具有可移植性

(1)在int 为32位的机器上写成的数据文件无法直接在int为64位的机器上正确读出

——解决方案之一是放弃使用int,而是typedef具有明确大小的类型

——更好的方案是用文本

 

posted @ 2018-05-16 22:31  Strugglinggirl  阅读(153)  评论(0编辑  收藏  举报