fopen相关文件操作函数

typedef struct
{
int _fd;        // 文件号
int _cleft;     // 缓冲区中剩下的字节数
int _mode;      // 文件操作模式
char * _nextc;  // 下一个字节的位置
char * _buff;   // 文件缓冲区位置
}FILE;

1.fopen

函数原型:FILE * fopen(const char * path,const char * mode);
头文件:#include <stdio.h>
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
参数说明:
参数path字符串包含欲打开的文件路径及文件名;
mode有下列几种形态字符串:
mode字符串
含义
r
以只读方式打开文件,该文件必须存在
r+
以可读写方式打开文件,该文件必须存在
rb+
读写打开一个二进制文件,允许读写数据,文件必须存在
w
打开只写文件并清空文件内容。若文件不存在则建立该文件
w+
打开可读写文件并清空文件内容。若文件不存在则建立该文件
a
以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+
以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb
只写打开或新建一个二进制文件;只允许写数据。
wb+
读写打开或建立一个二进制文件,允许读和写。
ab+
读写打开一个二进制文件,允许读或在文件末追加数据
wx
创建文本文件,只允许写入数据
wbx
创建一个二进制文件,只允许写入数据
w+x
创建一个文本文件,允许读写
wb+x
创建一个二进制文件,允许读写
w+bx
和”wb+x”相同
示例:

     FILE *pF  = fopen(pathName, "r"); //打开文件
     fseek(pF, 0, SEEK_END); //文件指针移到文件尾
     nLen = ftell(pF);  //得到当前指针位置, 即是文件的长度
     rewind(pF);    //文件指针恢复到文件头位置

     //读取文件内容//读取的长度和源文件长度有可能有出入,这里自动调整 nLen
     nLen = fread(msg, sizeof(char), nLen, pF);

     msg[nLen] = '\0'; //添加字符串结尾标志
     fclose(pF);  //关闭文件

2.fclose

函数原型:int fclose(FILE * stream);
头文件:#include <stdio.h>
函数说明:fclose()用来关闭先前fopen()打开的文件. 此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源.
返回值:若关文件动作成功则返回0, 有错误发生时则返回EOF 并把错误代码存到errno.

3.fseek

函数原型:int fseek(FILE * stream, long offset, int whence);
头文件:#include <stdio.h>
函数说明:
fseek()用来移动文件流的读写位置.
参数说明:
stream 为已打开的文件指针,
参数offset 为根据参数whence 来移动读写位置的位移数。
参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置.
SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量.
当whence 值为SEEK_CUR 或SEEK_END 时, 参数offset 允许负值的出现.
下列是较特别的使用方式:
1) 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);
返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.
附加说明:fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.

off_t   lseek(int fildes, off_t offset, int whence);

4.ftell

函数原型:long ftell(FILE * stream);
头文件:#include <stdio.h>
函数说明:
ftell()用来取得文件流目前的读写位置.
参数说明:
stream 为已打开的文件指针.
返回值:
当调用成功时则返回目前的读写位置, 若有错误则返回-1, errno 会存放错误代码.可用ftell获得文件中数据的长度.
错误代码:EBADF 参数stream 无效或可移动读写位置的文件流.

5.fread

函数原型:size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
头文件:#include <stdio.h>
函数说明:
fread()用来从文件流中读取数据.
参数说明:
stream 为已打开的文件指针;
ptr 指向欲存放读取进来的数据空间;
nmemb 指定读取的字符数.
stream 为已打开的文件指针.
返回值:返回实际读取到的nmemb 数目,如果此值比参数nmemb 来得小, 则代表可能读到了文件的尾或有错误发生, 这时必须用feof()或ferror()来决定发生什么情况。
范例

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define nmemb 4
struct test{
    char name[20];
    int size;
} s[nmemb];

int main()
{
    FILE * stream;
    int i;
    stream = fopen("/tmp/fwrite", "r");
    fread(s, sizeof(struct test), nmemb, stream);
    fclose(stream);
    for(i = 0; i < nmemb; i++)
        printf("name[%d]=%-20s:size[%d]=%d\n", i, s[i].name, i, s[i].size);
    return 0;
}

执行结果:

name[0]=Linux! size[0]=6
name[1]=FreeBSD! size[1]=8
name[2]=Windows2000 size[2]=11

6.fwrite

函数原型:size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
头文件:#include <stdio.h>
函数说明:
fwrite()用来将数据写入文件流中.
参数说明:
stream 为已打开的文件指针,
ptr 指向欲写入的数据地址, 总共写入的字符数以参数size*nmemb 来决定.
stream 为已打开的文件指针.
返回值:返回实际写入的nmemb 数目.

7.rewind

函数原型:void rewind(FILE * stream);
头文件:#include <stdio.h>
函数说明:
rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和eof标记,相当于调用fseek(stream, 0, SEEK_SET)
参数说明:
stream 为已打开的文件指针.

8.fgets

函数原型:char* fgets(char * s, int size, FILE * stream);
头文件:#include <stdio.h>
函数说明:
fgets()用来从参数stream 所指的文件内读入字符并存到参数s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止, 最后会加上NULL 作为字符串结束.
参数说明:
s 存放读到的数据
size s最大能存放多少数据
stream 已打开的文件指针
返回值:
gets()若成功则返回s 指针, 返回NULL 则表示有错误发生.

9.fputs

函数原型:int fputs(const char * s, FILE * stream);
头文件:#include <stdio.h>
函数说明:fputs()用来将参数s 所指的字符串写入到参数stream 所指的文件内.
返回值:若成功则返回写入的字符个数, 返回EOF 则表示有错误发生.

10.fgetc

函数原型:int fgetc(FILE * stream);
头文件:#include <stdio.h>
函数说明:
fgetc()从参数stream 所指的文件中读取一个字符. 若读到文件尾而无数据时便返回EOF.
返回值:getc()会返回读取到的字符, 若返回EOF 则表示到了文件尾.
范例:

#include <stdio.h>
main()
{
    FILE *fp;
    int c;
    fp = fopen("exist", "r");
    while((c = fgetc(fp)) != EOF)
    printf("%c", c);
    fclose(fp);
}

11.fputc

函数原型:int fputc(int c, FILE * stream);
头文件:#include <stdio.h>
函数说明:fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中.
返回值:fputc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败.

12.feof

函数原型:int feof(FILE * stream);
头文件:#include <stdio.h>
函数说明:feof()用来侦测是否读取到了文件尾, 尾数stream 为fopen()所返回之文件指针. 如果已到文件尾则返回非零值, 其他情况返回0.
返回值:返回非零值代表已到达文件尾.

13.fflush

函数原型:int fflush(FILE* stream);
头文件:#include <stdio.h>
函数说明:
fflush()会强迫将缓冲区内的数据写入参数stream 指定的文件中.
如果参数stream 为NULL,fflush()会将所有打开的文件数据更新.
返回值:成功返回0, 失败返回EOF, 错误代码存于errno 中.
错误代码:EBADF 参数stream 指定的文件未被打开, 或打开状态为只读. 其它错误代码参考write().

14.fscanf

函数原型:int fscanf(FILE*stream,constchar*format,[argument...]);
头文件:#include <stdio.h>
函数说明:
从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
参数说明:
FILE *stream:文件指针
char *format:格式字符串
[argument…]:输入列表
返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。
格式类型
说明
%d
读入一个十进制整数
%i
读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d时会被算作31,但是使用%i时会算作25
%u
读入一个无符号十进制整数
%f %F %g %G
用来输入实数,可以用小数形式或指数形式输入
%x %X
读入十六进制整数
%o
读入八进制整数
%s
读入一个字符串,遇空字符‘\0’结束
%c
读入一个字符。无法读入空值。空格可以被读入

15.fprintf

函数原型:int fprintf (FILE* stream, const char*format, [argument]);
头文件:#include <stdio.h>

函数说明:
传送格式化输出到一个文件中与打印机输出
参数说明:
FILE*stream:文件指针
const char* format:输出格式
[argument]:附加参数列表
返回值:
输出的字符数,发生错误时返回一个负值

16.fdopen

函数原型:FILE * fdopen(int fildes, const char * mode);
头文件:#include <stdio.h>
函数说明:
fdopen()会将参数fildes 的文件描述词, 转换为对应的文件指针后返回.
参数mode 字符串则代表着文件指针的流形态,
注意此形态必须和原先文件描述词读写模式相同. 关于mode 字符串格式请参考fopen().
返回值:转换成功时返回指向该流的文件指针. 失败则返回NULL, 并把错误代码存在errno 中.
范例:

#include <stdio.h>
int main()
{
    FILE * fp = fdopen(0, "w+");
    fprintf(fp, "%s\n", "hello!");
   ; fclose(fp);
    return 0;
}

17.fileno

函数原型:int fileno(FILE * stream);
头文件:#include <stdio.h>
函数说明:fileno()用来取得参数stream 指定的文件流所使用的文件描述词.
返回值:返回文件描述词.
范例:

#include <stdio.h>
int main()
{
    FILE * fp;
    int fd;
    fp = fopen("/etc/passwd", "r");
    fd = fileno(fp);
    printf("fd=%d\n", fd);
    fclose(fp);
    return 0;
}

18. freopen

函数原型:FILE * freopen(const char * path, const char * mode, FILE * stream);
头文件:#include <stdio.h>
函数说明:
参数 path 字符串包含欲打开的文件路径及文件名。
参数mode 请参考fopen()说明.。
参数stream 为已打开的文件指针. Freopen()会将原stream 所打开的文件流关闭, 然后打开参数path 的文件。
返回值:文件顺利打开后, 指向该流的文件指针就会被返回. 如果文件打开失败则返回NULL, 并把错误代码存在errno 中。
范例:

#include <stdio.h>
int main()
{
    FILE * fp;
    fp = fopen("/etc/passwd", "r");
    fp = freopen("/etc/group", "r", fp);
    fclose(fp);
    return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值