一、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);