文件操作函数的使用和区别

来源:互联网 发布:java迷宫小游戏设计 编辑:程序博客网 时间:2024/05/21 22:19

一、fopen  与 fclose 函数的使用

fopen 函数用于打开一个文件

函数定义:FILE *fopen(const char *filename, const char *mode);

fopen 的返回值是一个文件指针,FILE 是在stdio.h中定义的结构体类型,封装了与文件相关的信息:

struct   _iobuf   { 
         char   *_ptr;                  //文件输入的下一个位置 
         int       _cnt;                //当前缓冲区的相对位置 
         char   *_base;                 //指基础位置(应该是文件的其始位置) 
         int       _flag;               //文件标志 
         int       _file;              //文件的有效性验证 
         int       _charbuf;           //检查缓冲区状况,如果无缓冲区则不读取 
         int       _bufsiz;            //文件的大小 
         char   *_tmpfname;            //临时文件名 
}; 
typedef   struct   _iobuf   FILE;


以上就是库中FILE的成员内容。

fopen有两个形参,filename表示文件的路径以及文件的名字;mode指文件的打开方式,如下:

                       表  文件操作类型    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━          字符                含义    ────────────────────────────           "r"           打开文字文件只读           "w"           创建文字文件只写           "a"           增补, 如果文件不存在则创建一个           "r+"          打开一个文字文件读/写           "w+"          创建一个文字文件读/写           "a+"          打开或创建一个文件增补           "b"           二进制文件(可以和上面每一项合用)           "t"           文这文件(默认项)    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━    如果要打开一个CCDOS子目录中, 文件名为CLIB的二进制文件, 可写成:     fopen("c://ccdos//clib", "rb");    如果成功的打开一个文件, fopen()函数返回文件指针,   否则返回空指针 (NULL)。由此可判断文件打开是否成功。
下面举一个例子:
     #iclude<stdio.h>     main()     {          FILE *fp;                /*定义一个文件指针*/          int i;          fp=fopen("CLIB", "rb");  /*打开当前目录名为CLIB的文件只读*/          if(fp==NULL)             /*判断文件是否打开成功*/             puts("File open error");/*提示打开不成功*/          i=fclose(fp);            /*关闭打开的文件*/          if(i==0)                 /*判断文件是否关闭成功*/            printf("O,K");         /*提示关闭成功*/          else            puts("File close error");/*提示关闭不成功*/     }
这里用到了fclose函数,明显这是关闭文件的函数,定义为:int fclose(FILE *fp);
如果关闭成功返回0,否则返回非0值。

二、fgetc() 函数与 fputc()函数
fgetc()函数定义为: int fgetc(FILE *fp);
该函数是从一个只读或者读写方式打开的文件上读取字符;
读取成功返回该字符,若读取到文件末尾,则返回EOF;
fputc()函数定义为:  int fputc(int c, FILE *fp); 
该函数用于将一个字符写到一个文件上;
成功则返回字符c,这里说明一下int型的c只读取低八位,所以还是一个字符;如果写入失败,则返回EOF;
下面举个例子:从键盘输入一串字符,存到一个文件中
#include <stdio.h>#include <stdlib.h>int main(){FILE *fp;char ch;fp = fopen("./filetest.txt", "w");if (fp == NULL){perror("error");exit(EXIT_SUCCESS);}ch = getchar();while (ch != '\n'){fputc(ch, fp);ch = getchar();}fclose(fp);return 0;}
这里顺便提一下feof()函数,该函数定义为:int feof(FILE *fp);
用于检查是否到达文件的末尾,当文件指针指向EOF时,返回0值,否则返回非0值。
三、fgets() 函数与 gets()函数的比较,以及fputs() 函数与 puts()函数的比较
fgets()函数的定义为: char *fgets(char *s, int n, FILE *fp);
gets()函数的定义为: char *gets(char *s);
fgets()函数从fp所指向的文件中读取字符串并在字符串末尾添加'\0',然后存入s,最多读取n-1个字符,n的默认值是1024。当读取到回车换行符'\n',到达文件末尾EOF,或者读取满n-1个字符时,函数返回该字符串的首地址。所以读取的字符串会多出一个\n;因为出错时返回空指针NULL。
所以错误判断的代码可以这样写:
while (fgets(s, n, fp)){    ...;}
而不能使用:
while(!feof()) 
{ 
    fgets(); 
    ...; 
}
如果文件的末尾没有\n,那么可以使用下面一个判断,但是文件的末尾加入了\n那么第一次读取的是string\n\0;
,若是再使用fgets函数,那么读取到的string直接遇到EOF返回NULL,string的内容没有变。
gets函数没有限制读取的字符串的范围,所以可能会溢出造成错误,并且gets函数读取到回车键就结束,不会取到回车换行字符,所以相比于fgets函数长度小了一位。所以fgets函数读取的字符串可以进行这样的操作:
s[strlen(s) - 1] = '\0';覆盖掉\n字符。
fputs()函数定义为:int fputs(const char *s, FILE *fp);
用于将字符串写入文件中,字符串结束标志'\0'不写入,如果成功返回一个非负数,否则返回EOF;
puts()函数定义为:int puts(const char *string);
该函数等价于printf ("%s\n",s);注意puts向标准输出设备输出字符串并且自动换行即可。
四、scanf与fscanf 与 sscanf ; printf 与 fprintf 与 fwrite 函数的比较
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
定义为:int scanf(const char * restrict format,...);
在此不再赘述格式化输入的内容,详情可跳转至百度百科 int puts(const char *string)http://baike.baidu.com/link?url=TVLPtAEmlS5bihfOrl297TW8j1rBdXWNDoxDGYvhV3J4O7u-2mBwA3Qgz11eD-09rIesBlC0ux-AKeO56jNFjK  了解所有的格式化输入内容。
fscanf()函数定义为:int fscanf(FILE *fp, const char *format, ...);
用于按指定的格式从文件读取数据,第一个参数为文件指针,第二个参数为格式化控制参数。
fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
sscanf()函数:利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
1. 常见用法。char str[512] = {0};sscanf("123456 ", "%s", str);printf("str=%s\n", str);2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。sscanf("123456 ", "%4s", str);printf("str=%s\n", str);3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。sscanf("123456 abcdedf", "%[^ ]", str);printf("str=%s\n", str);4. 取仅包含指定字符集的字符串。1-9和小写字母sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);printf("str=%s\n", str);5. 取到指定字符集为止的字符串。遇到大写字母为止的字符串。sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);printf("str=%s\n", str);

fprintf()函数定义为:int fprintf(FILE *stream, const char *format, ...);
主要功能是将指定的字符串以特定的格式打印到指定的文件中。返回值返回成功打印的字符个数,失败时返回一个负数。

fwrite()函数定义为: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能是将ptr指向的字符串中nmemb个size大小的数据写入到指向的文件中去,写入成功返回成功写入的个数(不是字符个数),失败则返回短的写入个数或者返回0。

原创粉丝点击