C语言标准库 文件操作

参考网页

http://www.360doc.com/content/11/0521/11/5455634_118306098.shtml

http://www.cppblog.com/yearner/archive/2006/12/23/16773.html

http://hi.baidu.com/dujt/blog/item/f6e6704ab5d8932508f7ef2c.html

http://blog.csdn.net/qinzhonghello/article/details/4039507

两种文件操作类型

  流式文件操作和标准I/O文件操作

  区别:通过直接存/取文件来完成对文件的处理,而流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个 FILE 指针来进行,而此类文件操作是围绕一个文件的“句柄”来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号。此类文件操作常用的函数如下表,这些函数及其所用的一些符号在io.h和fcntl.h中定义,在使用时要加入相应的头文件。

  其实上面说的还不够实质,这两种类型的真正区别可以根据她们的分别对应的另外一个称呼来剖析:

  流式文件操作又叫做:Buffer I/O 操作      : 数据  ->  流式缓冲区  ->  内核缓冲区  ->  磁盘

  标准I/O文件操作又叫做:UnBuffer I/O 操作   : 数据  ->  内核缓冲区  ->  磁盘

流式文件

这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:

typedef struct {
int level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
int bsize; /* Buffer size */
unsigned char _FAR *buffer; /* Data transfer buffer */
unsigned char _FAR *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */

文件指针的特性:

  • 可在“负无穷”到“正无穷”任意移动;
  • 在0~N-1之外进行读操作,则读失败;读失败后,feof函数为真;
  • 从N位置开始写入,则为添加;
  • 从0~N位置之外开始写也可,其行为不必掌握,因为几乎无用;
  • 无论任何方式,刚打开文件时,ftell函数返回值都是0,含a方式的文件,只要一写(第一次写),文件指针自动移动到N位置处。 
    int feof(FILE *fp) 
    若文件读失败,则返回非0值,否则返回0值;仅用于读是否到文件尾。 
    任何fseek操作使feof为假,即使文件指针在0~N-1之外。

移动文件指针相关函数

1)从pos位置开始,移动off个字节

  fseek(FILE *fp,long off,int pos) 

  pos: 0 文件开始 
      1 文件当前指针位置 
      2 文件结尾(文件长度为N,则指针位置为N)

  E:

    fseek(fp,-1L,2); /*移动指针到最后一个字节*/ 

    fseek(fp,-2L,1); /*移动指针到当前位置的前两个位置*/ 

2)文件指针重置为0

  rewind(FILE *fp) 

  E:

    fseek(fp,0l,0);←→rewind(fp) 

3)求当前指针位置

  long ftell(FILE *fp) 

  E: 求文件长度 

    fseek(fp,OL,2); 
    len=ftell(fp); //则len为文件长度

4)判断是否到文件尾

  feof(FILE * fp)

文件名字符串的操作

1)去掉扩展名:

  _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" );

  printf( "Path created with _makepath: %s\n\n", path_buffer );

  _splitpath( path_buffer, drive, dir, fname, ext );



posted @ 2011-07-27 14:26  jqb  阅读(1360)  评论(0编辑  收藏  举报