C语言小碎片四

来源:互联网 发布:python获取命令行参数 编辑:程序博客网 时间:2024/05/21 11:23

C语言的文件处理相关

 

对于现代的编程语言来说,能够对文件数据进行处理是非常有必要的。那么我们有必要了解,到底什么是文件。文件(file)通常的解释是存储在数据存储器中的一段命名的格式化的数据。再进一步,C语言视文件为连续的字节序列,可以字节读取的数据集合(这和C起源于UNIX环境有关,不同的操作系统,存在文件系统的差异,包括文件模型的区别,C语言在此基础上使用的是标准高级I/O【standardhigh-level I/O】,是基于不同操作系统本身的低级I/O【low-level I/O】转换而来的通用的I/O接口)。

C语言的标准中存在着文本视图(text view)和二进制视图(binary view)两种文件视图,对应的是文本编码存储文件和二进制编码存储文件。文本文件以字符编码的方式保存文件数据(适合保存文本数据),二进制文件将内存中数据以二进制原编码的方式保存文件(优点在于可随机存取,存取速度快,节省存储空间)。

C程序中三个默认打开的与文件处理相关的文件分别是:标准输入(standard input)、标准输出(standard output)、标准错误输出(standard erroroutput)。标准输入(standard input)关联系统的输入设备,通常为键盘;标准输出(standard output)、标准错误输出(standard erroroutput)关联输出设备,通常为显示器。但也可以对其进行重定向。

C语言中文件存的取方式包括顺序存取和随机存取。顺序存取方式指的是在读取数据的时候单笔单笔的读取,存数据的时候数据被单笔单笔的附加在文件末尾。随机存取是以二进制文件为主的,以结构为单位来进行数据的存取。

在C语言陈序中数据的交互是以数据流的形式进行的。这具体的体现在于我们要进行文件数据操作的时候都必须先“打开文件”,实际上,在这里的操作就是打开数据流。

C语言中的fopen()函数。该函数的原型是:_CRTIMP FILE* __cdecl fopen(const char *, const char *);该函数接受两个参量文件名以及模式字符串,返回一个文件指针(file pointer),打开失败返回NULL值。未指定路径情况下默认当前工作目录。还有一点需要知道的是使用fopen()函数打开的文件会先将文件复制到缓冲区。文件指针(file pointer)指向一个FILE结构体,该结构体定义在头文件 stdio.h 中,该结构体中包括了文件I/O使用的缓冲区信息和其他信息(感兴趣的可以查看该结构体定义,以便了解其具体包含的信息)。因为缓冲区的存在还需注意在使用fclose()函数关闭文件之前,所有的更改都是相对缓冲区的,只有在使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。之所以使用缓冲区是有原因的,一方面是为了获得统一的数据处理方式,避免直接使用低级I/O直接对磁盘操作,从而获得跨平台能力,另一方面就是获取跟快的速度了,因为缓冲区存在于内存而非磁盘。

C语言的文本文件操作相关的操作包括打开、关闭、读取、写入、设置缓冲区。相关的I/O操作函数包括文件开闭函数:fopen()、 fclose(),字符存取函数fgetc()、fputc(),字符串存取函数fgets()、fputs(),  格式化存取函数fprintf()、fscanf()等。函数中可以使用的模式字符串包括"r"、"w"、"a"、"r+"、"w+"、"a+"。"r":只能从文件中读数据,该文件必须先存在,否则打开失败。"w":只能向文件写数据,若指定的文件不存在则创建它,如果存在则先将文件长度截为0。"a":向文件增加新数据(不删除原有数据),若文件不存在则会创建文件,打开时位置指针移到文件末尾。"r+":可读/写数据,该文件必须先存在,否则打开失败。"w+":可读/写数据,可用该模式打开、新建文件,文件存在是会将文件长度截为0。"a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾,向文件尾部追加内容,如果文件不存在则会创建文件。

fclose()函数, 用于关闭一个流。该函数可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区,如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。函数原型为:_CRTIMP int __cdecl fclose(FILE *);

fgetc ()函数, 从文件中读取一个字符,读取一个字节后,光标位置后移一个字节。会返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。函数原型为:_CRTIMP int __cdecl fgetc(FILE *);

fputc()函数该函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。函数原型为:_CRTIMP int __cdecl fputc(int, FILE *);

fgets()函数从指定文件读入一个字符串,如:fgets(str, n,fp);参数n为要求得到的字符个数,但只从fp指向的文件输入n-1个字符,然后在最后加一个'\0'字符,因此得到的字符串共有n个字符,把它们放在字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读入结束。函数原型为:_CRTIMP char * __cdecl fgets(char *, int,FILE *);

fputs()函数该函数用于向指定文件输出一个字符串,如:fputs(str,fp); 把str输出到fp指向的文件。fputs函数的第一个参数可以是字符串常量、字符数组名或字符型指针。若输出成功,则返回0,否则返回EOF。函数原型为:_CRTIMP int __cdecl fputs(constchar *, FILE *);

fscanf()函数该函数 从一个流中执行格式化输入,fscanf()遇到空格和换行时结束,注意空格时也结束。这与fgets()有区别,fgets()遇到空格不结束。返回值为整型,数值等于[...]的个数。函数原型为:_CRTIMP int __cdecl fscanf(FILE *, const char *, ...);

fprintf()函数该函数用于 格式化输出到一个流/文件中,fprintf()的返回值是输出的字符数,发生错误时返回一个负值。函数原型为:_CRTIMP int __cdecl fprintf(FILE *, constchar *, ...);

C语言的二进制文件操作相关的I/O操作函数包括: fread()、 fwrite()、fseek()、ftell()、fgetpos()、fsetpos()等。函数中可以使用的模式字符串包括"rb"、"wb"、"ab"、"ab+"、"wb+"(这里加b适应的是区分二进制文件和文本文件的系统环境)等。

fread()函数,该函数用于从文件读取数据,例如:string fread (int handle, int length );从文件指针 handle 读取最多 length 个字节。 该函数在读取完length 个字节数,或到达EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,具体看先遇到哪种情况。函数原型_CRTIMPsize_t __cdecl fread(void *, size_t, size_t, FILE *);

fwrite ()函数该函数用于向文件写入数据,并且会返回实际写入的数据块数目。例如:pFile =fopen ("mytest.bin" , "wb" );fwrite (buffer , sizeof(buffer), 1 ,pFile );函数原型:_CRTIMP size_t __cdecl fwrite(const void *,size_t, size_t, FILE *);

fseek()函数该函数用于设置文件指针的位置。如果该函数成功执行,fp将指向以origin为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变fp指向的位置,函数返回一个非0值。函数原型: _CRTIMP int __cdecl fseek(FILE*fp,long offset,int origin);

ftell()函数,该函数用于得到文件位置指针当前位置相对于文件首的偏移字节数。函数原型: _CRTIMP long __cdecl ftell(FILE* fp);

fgetpos()函数和fsetpos()函数这两个函数函是fseek()和ftell的改进版本,使得可操作的文件的大小变得更大。数原型: _CRTIMP int __cdecl fgetpos(FILE* restrict stream,fpos_t * restrict pos);_CRTIMP int __cdecl fsetpos(FILE*fp, const fpos_t *pos);

C语言对文件结尾的处理。从文件中读取数据需要在文件结尾时结束操作。C语言中规定了一个文件结尾标记EOF,EOF是一个特殊值。但是C语言中只有在读取超出文件结尾以后才会发现文件的结尾。为了避免读取空文件的问题,C语言中好的方式是用前检测,就是说要是用数据就应该先读取文件一次。

C语言中其他的一些I/O函数。

ungetc()函数该函数可以把一个(或多个)字符退回到输入流中。成功则返回相应的字符,否则返回EOF。函数原型:_CRTIMP int __cdecl ungetc(intc,FILE *stream);

fflush()函数该函数用于刷新文件缓冲区,当文件以写方式打开时,会将缓冲区内容写入文件。函数原型: _CRTIMP int __cdecl fflush(FILE*fp); 

setvbuf()函数该函数用于关联缓冲区与数据流。形参列表中参数:stream:指向流的指针 ;buf:期望缓冲区的地址;type:期望缓冲区的类型。函数原型:_CRTIMP int __cdeclsetvbuf ( FILE * stream, char * buffer, int mode, size_t size );

feof()函数该函数用于检测文件结尾。如果最近一次调用检测到文件结尾,则该函数会返回一个非0的指,否则返回0。函数原型:_CRTIMP int __cdecl feof(FILE *);

ferror()函数,该函数用于检测调用各种I/O函数是否出现错误。如果发生错误,该函数返回一个非0值,否则返回0.函数原型: _CRTIMP int __cdecl ferror(FILE*stream);

原创粉丝点击