您的位置:首页 > 运维架构

fopen相关文件操作函数

2016-01-27 15:13 405 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: