一、fopen()
FILE * fopen(const char * path, const char * mode);

参数

  • 参数1:打开的文件路径及文件名称
  • 参数2:文件打开的方式

返回值

  • 打开成功:返回文件指针
  • 打开失败:返回NULL。并把错误代码存在 error 中。

文件打开方式

r

以只读方式打开文件(若文件不存在打开失败)
r+ 以可读可写的方式打开文件(若文件不存在打开失败)
w 以只写的方式打开文件。若文件存在则清空文件内容。若文件不存在则创建文件
w+ 以可读可写的方式打开文件。若文件存在则清空文件内容。若文件不存在则创建文件
a 以附加的方式打开文件,只可写。若文件存在则写入的数据附加在源文件内容后面。若文件不存在则创建文件
a+ 以附加的方式打开可读可写文件
二、fclose()
int fclose( FILE *fp );

参数

  • 文件指针

返回值

  • 如果流关闭成功: 返回 0,
  • 如果流关闭失败:否则返回EOF(-1)

注意事项

  • 如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF
  • 文件关闭之后,文件光标移动到文件最前面
三、feof()
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);

功能

  • 用于得到文件当前指针位置相对于文件首的偏移字节数

返回值

  • 返回当前文件指针相对于文件首的位移,位移为字节数

注意

  • 因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错
六、fseek()
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);
}