基于C的文档操作

2008-02-23 05:33:50来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在ANSI C中,对文档的操作分为两种方式,即流式文档操作和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 */

  FILE这个结构包含了文档操作的基本属性,对文档的操作都要通过这个结构的指针来进行,此种文档操作常用的函数见下表 函数 功能
fopen() 打开流
fclose() 关闭流
fputc() 写一个字符到流中
fgetc() 从流中读一个字符
fseek() 在流中定位到指定的字符
fputs() 写字符串到流
fgets() 从流中读一行或指定个字符
fprintf() 按格式输出到流
fscanf() 从流中按格式读取
feof() 到达文档尾时返回真值
ferror() 发生错误时返回其值
rewind() 复位文档定位器到文档开始处
remove() 删除文档
fread() 从流中读指定个数的字符
fwrite() 向流中写指定个数的字符
tmpfile() 生成一个临时文档流
tmpnam() 生成一个唯一的文档名


  下面就介绍一下这些函数

1.fopen()
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能

为使用而打开一个流
把一个文档和此流相连接
给此流返回一个FILR指针
参数filename指向要打开的文档名,mode表示打开状态的字符串,其取值如下表

字符串 含义
"r" 以只读方式打开文档
"w" 以只写方式打开文档
"a" 以追加方式打开文档
"r " 以读/写方式打开文档,如无文档出错
"w " 以读/写方式打开文档,如无文档生成新文档

  一个文档能够以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'n',而二进制模式认为他是两个字符0x0D,0x0A;假如在文档中读到0x1B,文本模式会认为这是文档结束符,也就是二进制模型不会对文档进行处理,而文本方式会按一定的方式对数据作相应的转换。

  系统默认的是以文本模式打开,能够修改全部变量_fmode的值来修改这个配置,例如_fmode=O_TEXT;就配置默认打开方式为文本模式;而_fmode=O_BINARY;则配置默认打开方式是二进制模式。

  我们也能够在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文档,"w t"或"wt "表示以文本模式打开读/写文档。

  此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并和一个特定的文档相连,假如成败,返回NULL。

例:

  FILE *fp;
  if(fp=fopen("123.456","wb"))
    puts("打开文档成功");
  else
    puts("打开文档成败");

2.fclose()
  fclose()的功能就是关闭用fopen()打开的文档,其原型是:int fclose(FILE *fp);假如成功,返回0,失败返回EOF。

  在程式结束时一定要记得关闭打开的文档,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。

例:fclose(fp);

3.fputc()
  向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。

例:fputc('X',fp);

4.fgetc()
  从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。

例:char ch1=fgetc(fp);

5. fseek()
  此函数一般用于二进制模式打开的文档中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);假如成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是

符号常量 值 基准位置
SEEK_SET 0 文档开头
SEEK_CUR 1 当前读写的位置
SEEK_END 2 文档尾部

例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)

  fseek(fp,0L,2);//把读写位置移动到文档尾

6.fputs()
  写一个字符串到流中,原型int fputs(const char *s, FILE *stream);

例:fputs("I Love You",fp);

7.fgets()
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,假如成功则返回s的指针,否则返回NULL。

例:假如一个文档的当前位置的文本如下

Love ,I Have

But ........

假如用

  fgets(str1,4,file1);

则执行后str1="Lov",读取了4-1=3个字符,而假如用

  fgets(str1,23,file1);

则执行str="Love ,I Have",读取了一行(不包括行尾的'n')。

8.fprintf()
  按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,但是不是写到控制台,而是写到流罢了

例:fprintf(fp,"-%s",4,"Hahaha");

9.fscanf()
  从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,但是不是从控制台读取,而是从流读取罢了。

例:fscanf(fp,"%d%d" ,&x,&y);

10.feof()
  检测是否已到文档尾,是返回真,否则返回0,其原型是int feof(FILE *stream);

例:if(feof(fp))printf("已到文档尾");

11.ferror()
  原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除他,clearerr()的原型是void clearerr(FILE *stream);

例:printf("%d",ferror(fp));

12.rewind()
  把当前的读写位置回到文档开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C查找某个目录下的任何文档(包括子目录)(转)

下一篇: C创建新线程的源码