带缓存的I/O操作
标准的I/O库提供缓冲的目的是尽可能地减少使用read和write的调用次数,它也是对每个I/O流自动的缓冲管理,从而避免应用程序需要考虑这一点所带来的的麻烦,不幸的是,标准I/O库最令人迷惑的也是缓冲
fopen函数
fopen函数用于打开文件
fopen函数使用说明
表头文件 | #include <stdio.h> |
---|---|
定义函数 | FILE *fopen(const char *pathname,const char *mode) |
函数说明 | 参数 path是将要打开的文件路径,参数mode字符串则代表着流形态,mode有下面几种字符串 ,R:打开只读文件,这个文件必须存在, r+:打开可读写文件,这个文件必须存在,w :打开只写文件,若文件长度为0,则文件内容消失,w+:打开可读写文件,如果文件长度为0,则文件内容清空,文件不存在则创建,a : 以附加方式打开只写文件,文件存在,写入的数据会加到文件尾,不存在则建立,a+ : 以附加的方式打开可读写文件,存在则写到文件尾,不存在则穿件。在上面几个字符串中加个b,如ab,ab+,意思是以二进制的方式打开文件 |
返回值 | 文件顺利打开后,指向该流的文件指针会被返回,若文件打开失败,则返回NULL 并把错误代码存在error中 |
附加说明 | 一般而言,开文件后会 作一些文件读取或写入动作,若文件打开失败,接下来的读写动作无法进行,所以要对fopen进行错误判断处理 |
fclose函数
fclose函数用来关闭文件
fclose函数使用说明
表头文件 | #include <stdio.h> |
---|---|
定义函数 | int fclose(FILE *stream) |
函数说明 | fclose()函数用来关闭fopen()打开的文件,此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源 |
-返回值- | 成功返回0,不成功则返回EOF,并把错误代码存到error中 |
错误代码 | EBADF表示参数stream非以打开的文件 |
fdopen函数
fdopen函数用于将文件描述词转为文件指针
fdopen函数说明
表头文件 | #include <stdio.h> |
---|---|
定义函数 | FILE *fdopen(int fildes,const char *mode) |
函数说明 | fdopen()会将参数fildes的文件描述词转换为对应的文件指针后返回,参数mode字符串代表着文件指针的流形态,此形态必须和原来的文件描述词读写模式一样 |
返回值 | 转换成功时返回指向流针的文件指针,失败返回NULL,并把错误代码存在error中 |
例如
#include <stdio.h>
int main ()
{
FILE *fp = fdopen(0,"w+") ;
fprintf (fp,"s%\n","hello”);
fclose(fp);
}
fread函数
fread函数用于从文件流读取数据
fread使用说明
表头文件 | #include <stdio.h> |
---|---|
定义函数 | fread(void *ptr,size_t size , size_t nmemb,FILE *stream) |
函数说明 | fread()用来从文件流中读取数据,参数stream为以打开的文件指针,参数ptr指向欲存放读取进来的数据空间,读取的字符数由参数size *nmemb来决定的,fread()会返回实际读到的nmemb数目,如果此值参数比nmemb小,则代表可能读到文件尾或有错误发生,这时必须用feof()和ferror()来判断发生什么情况 |
返回值 | 返回实际读取到的nmemb数目 |
fwrite函数
fwrite函数用于将数据写到文件流
fwrite函数使用说明
表头文件 | #include <stdio.h> |
---|---|
定义函数 | fread(void *ptr,size_t size , size_t nmemb,FILE *stream |
函数说明 | fwrite()用来将数据写入文件流,参数steam为以打开的文件指针,参数ptr指向欲写入的数据地址,总共写入的字符数由参数size*nmemb来决定的,fwrite()会返回实际写入的nmemb数目 |
返回值 | 返回实际写入的nmemb数目- |
fseek函数
fseek函数用于移动文件流的读写位置
fseek函数使用说明
表头文件 | #include<stdio.h> |
---|---|
函数定义 | int fseek(FILE *stream ,long offset ,int whence) |
函数说明 | fseek()用来移动文件流的读写位置,参数stream为已打开的文件指针,参数offset为根据参数whence来移动 读写位置的位移数,参数whence为下列其中的一种:SEEK_SET从距文件开头offset位移量为新的读写位置:SEEK_CUR以目前的读写位置往后增加offset个位移量:SEEK_END将读写位置指向文件尾在增加offset个位移量 |
返回值 | 当调用成功时返回0,错误返回-1,并把错误返回error中 |
fgetc函数
fgetc函数用于从文件中读取一个字符
fgetc函数使用说明
表头文件 | #include<stdio.h> |
---|---|
定义函数 | int fgetc(FILE *stream) |
函数说明 | fgetc()用来从参数stream所指的文件中读取一个字符,若读到文件尾而无数据时便返回EOF |
返回值 | fgetc()返回读取到的字符,若返回EOF则表示到了文件尾 |
fputc函数
fputc函数用于将指定字符写入文件流中
fputc函数使用说明
表头文件 | #include<stdio.h> |
---|---|
定义函数 | int fputc(int c,FILE *stream) |
函数说明 | fputc函数将参数c转换成unsigned char 后写入参数stream指定的文件中 |
返回值 | 返回写入成功的字符,即参数c:若返回EOF则代表写入失败- |
用例说明实现在text1.txt和text2.txt文件中除去首行和末尾对应的数据,要求三个文本内容如下:
text1 text2 text3
begin begin begin
10 11 12 15 16 17 25 27 29
20 21 22 25 26 27 45 47 49
30 31 32 35 36 37 65 67 69
end end end
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
FILE *fp1,fp2,fp3 ;
char ch1 ;
char ch2;
char ch3 ;
int sum ;
int temp1 = 0,temp2 = 0 ;
if ((fp1 = fopen("t1","r")) == NULL)
{
printf ("打不开t1文件\n") ;
exit(1) ;
}
if ((fp2 = fopen("t2","r")) == NULL)
{
printf ("打不开t2文件\n") ;
exit(1) ;
}
if ((fp1 = fopen("t3","w+")) == NULL)
{
printf ("打不开t3文件\n") ;
exit(1) ;
} ```
while (((ch1 = fgetc(fp1)) != EOF) && (ch2 = fgetc(fp2)) !=EOF)
{
if (ch1<'0' ||ch1>'9')
{
fput(ch1,fp3) ;
}
else
{
temp1 = ch1 - '0' ;
temp2 = ch2 - '0' ;
sum = temp1 + temp2 ;
ch3 = sum + '0' ;
fputc (ch3,fp3) ;
}
}
return 0;
}