FILE * fopen(const char * path, const char * mode);
参数
- 参数1:打开的文件路径及文件名称
- 参数2:文件打开的方式
返回值
- 打开成功:返回文件指针
- 打开失败:返回NULL。并把错误代码存在 error 中。
文件打开方式
r |
以只读方式打开文件(若文件不存在打开失败) |
r+ | 以可读可写的方式打开文件(若文件不存在打开失败) |
w | 以只写的方式打开文件。若文件存在则清空文件内容。若文件不存在则创建文件 |
w+ | 以可读可写的方式打开文件。若文件存在则清空文件内容。若文件不存在则创建文件 |
a | 以附加的方式打开文件,只可写。若文件存在则写入的数据附加在源文件内容后面。若文件不存在则创建文件 |
a+ | 以附加的方式打开可读可写文件 |
int fclose( FILE *fp );
三、feof()参数
- 文件指针
返回值
- 如果流关闭成功: 返回 0,
- 如果流关闭失败:否则返回EOF(-1)
注意事项
- 如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF
- 文件关闭之后,文件光标移动到文件最前面
int feof(FILE *stream);
功能
- 判断文件流是否到达文件尾部
返回值
- 文件达到文件尾:返回非0值
- 文件没达到文件尾:否则返回0。
注意
- 文件结束符只能被clearerr()清除
#include<stdio.h>
int main(void)
{
FILE *streamfopen("DUMMY.FIL", "r");
fgetc(stream);
if(feof(stream))
printf("We have reached the end of file\n");
fclose(stream);
return 0;
}
四、ferror()
int ferror(FILE *stream);
功能
- 判断文件是否出错
返回值
- 未出错:如果ferror返回值为0(假)
- 出错:返回一个非零值
注意
- 对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值。因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失
- 在执行fopen函数时,ferror函数的初始值自动置为0
#include<stdio.h>
int main(void)
{
FILE*stream=fopen("DUMMY.FIL","w");
(void)getc(stream);
if(ferror(stream))/*testforanerroronthestream*/
{
printf("ErrorreadingfromDUMMY.FIL\n");
clearerr(stream);
}
fclose(stream);
return0;
}
五、rewind()
void rewind(FILE *stream);
功能
- 将文件内部的位置指针(光标)重新指向一个流(数据流/文件)的开头
注意
- 对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值。因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失
- 在执行fopen函数时,ferror函数的初始值自动置为0
#include <stdio.h>
int main(void)
{
FILE *fp=NULL;
if(fp=fopen("1.txt,"r+"))
{
fseek(fp,0,SEEK_END);
printf("文件偏移:%d",ftell(fp));
}
rewind(fp);
close(fp);
return 0;
}
五、ftell()
long ftell(FILE *stream);
六、fseek()功能
- 用于得到文件当前指针位置相对于文件首的偏移字节数
返回值
- 返回当前文件指针相对于文件首的位移,位移为字节数
注意
- 因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错
int fseek(FILE *stream, long offset, int fromwhere);
功能
- 把当前的文件流指针指定到指定的位置处
返回值
- 如果执行成功:函数返回0
- 如果执行失败:函数返回一个非0值
参数
- 参数1:文件指针
- 参数2:偏移量。正数表示正向偏移,负数表示负向偏移
- 参数3:设定从文件的哪里开始偏移
参数3的取值
- SEEK_SET: 文件开头(0)
- SEEK_CUR: 当前位置(1)
- SEEK_END: 文件结尾(2)
fseek(fp,100L,0); //把文件指针移动到离文件开头100字节处;
fseek(fp,100L,1); //把文件指针移动到离文件当前位置100字节处
fseek(fp,-100L,2); //把文件指针退回到离文件结尾100字节处
七、fgetpos()、fsetpos()
- fseek和ftell所能操作的文件大小为long类型范围之类的,不能操作大文件。下面这两个函数就可以对大文件进行操作
fpos_t文件定位类型
- 不是基本类型
- fpos_t类型的对象可以在文件中指定一个位置
- fpos_t定义的变量值以内部格式存储。仅由fgetpos和fsetpos使用
int fgetpos(FILE * restrict stream,fpos_t * restrict pos);
功能
- 获得当前文件指针所处的位置,并把这个位置保存在参数2的pos变量中
参数
- 参数1:文件流
- 参数2:fpos_t类型的指针
返回值
- 成功:返回0
- 失败:返回一个非零值
int fsetpos(FILE *stream, const fpos_t *pos);
功能
- 将文件指针定位在pos指定的位置上
参数
- 参数1:文件流
- 参数2:fpos_t类型的指针
返回值
- 成功:返回0
- 失败:返回一个非零值
#include <stdlib.h>
#include <stdio.h>
void showpos(FILE *stream);
int main(void)
{
FILE *stream;
fpos_t filepos;
stream = fopen("DUMMY.FIL", "w+");
fgetpos(stream, &filepos);
fprintf(stream, "This is a test");
showpos(stream);
if (fsetpos(stream, &filepos) == 0)
showpos(stream);
else{
fprintf(stderr, "Error setting file pointer.\n");
exit(1);
}
fclose(stream);
return 0;
}
void showpos(FILE *stream)
{
fpos_t pos;
fgetpos(stream, &pos);
printf("File position: %ld\n", pos);
}
八、fflush()
int fflush(FILE *stream);
功能
- 会强迫将缓冲区内的数据写回参数stream指定的文件中
- 如果参数stream为NULL,fflush()会将所有打开的文件数据更新
返回值
- 如果成功刷新:返回0。指定的流没有缓冲区或者只读打开时也返回0值
- 错误:返回EOF
注意
- 如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数
printf("please enter:");
fflush(stdout); //将缓冲区的数据都刷新到标准输出stdout中
ssize_t _s = read(0,buf,sizeof(buf)-1);
九、setvbuf()
int setvbuf(FILE *stream, char *buf, int type, unsigned size);
功能
- 设置文件的缓冲区
参数
- 参数1:处理的流指针
- 参数2:待使用的存储区。可以为NULL(如果未NULL该函数会自动分配一个缓冲区)
- 参数3:期望缓冲区的类型
- 参数4:缓冲区内字节的数量
参数3的取值
- _IOFBF(满缓冲):完全缓冲(在缓冲区满时才刷新)
- _IOLBF(行缓冲):行缓冲(缓冲区慢时,或者向缓冲区写入一个换行符时刷新缓冲区)
- _IONBF(无缓冲):无缓冲(没有缓冲区,直接从流中读入/写入数据)
返回值
- 设置成功:返回0
- 设置失败:返回非0值
注意
- 打开文件之后且未对流进行其它操作之前调该函数
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fp_src;
char buffer[128],buff[10];
int i;
f((fp_src=fopen(argv[1],"r+"))== NULL){
exit(EXIT_FAILURE);
}
setvbuf(fp_src,buffer,_IOLBF,128); //设置行缓冲区
do
{
memset(buff,'\0',10);
i = fread(buff,1,10,fp_src);
}while(i==10);
fclose(fp_src);
}
int main(int argc, char *argv[])
{
FILE *fp_src;
f((fp_src=fopen(argv[1],"r+"))== NULL){
exit(EXIT_FAILURE);
}
setvbuf(fp_src,NULL,_IONBF,128); //设置无缓冲区
fclose(fp_src);
}