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

fread,fwrite,fopen,fclose .fseek用法

2013-05-17 18:28 435 查看
1.用法:

int fread(void *buffer,int size,int count,FILE *fp);

int fwrite(void *buffer,int size,int count,FILE *fp);

2.功能:

fread()——从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中; buffer是存放读入数据的起始地址(即存放何处)。

fwrite()——从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中。buffer是要输出数据在 内存中的起始地址(即从何处开始输出)。

一般用于二进制文件的处理。

3.fseek用法

int fseek(FILE *stream, long offset, int fromwhere);

第一个参数file指针

第二个参数移动的偏移量

第三个参数移动到哪里

分别用3个宏

SEEK_SET 既0 文件开头

SEEK_CUR 既1 文件当前位置

SEEK_END 既2 文件结尾

但不推荐用数字 最好用宏

简言之:

fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;

fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处;

fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。

此函数常用来计算流的长度:

int filesize = fseek( fp, 0, SEEK_END );

fseek( fp, 0, SEEK_SET );

fopen(打开文件)

相关函数

open,fclose

表头文件

#include<stdio.h>

定义函数

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

函数说明

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上 述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

返回值

文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。

附加说明

一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

fwritefread是以记录为单位的I/O函数,freadfwrite函数一般用于二进制文件的输入输出。

#include<stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE*stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE*stream);

返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录

数小于nmemb,也可能返回0。

fread



fwrite

用于读写记录,这里的记录是指一串固定长度的字节,比如一个

int

、一个结构体或者一个定长数组。参数

size

指出一条记录的长度,而

nmemb

指出要读或写多少条记录,这些记录在

ptr

所指的内存空间中连续存放,共占

size * nmemb

个字节,

fread

从文件

stream

中读出

size * nmemb

个字节保存到

ptr

中,而

fwrite



ptr

中的

size * nmemb

个字节写到文件

stream

中。

nmemb

是请求读或写的记录数,

fread



fwrite

返回的记录数有可能小于

nmemb

指定的记录数。例如当前读写位置距文件末尾只有一条记录的长度,调用

fread

时指定

nmemb

为2,则返回值为1。如果当前读写位置已经在文件末尾了,或者读文件时出错了,则

fread

返回0。如果写文件时出错了,则

fwrite

的返回值小于

nmemb

指定的值。下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体

freadfwrite的例子程序如下:

#include <stdio.h>

#include <stdlib.h>

struct record {

char name[10];

int age;

};

int main(void)

{

struct record array[2] = {{"Ken", 24}, {"Knuth", 28}};

FILE *fp = fopen("recfile", "w");

if (fp == NULL) {

perror("Open file recfile");

exit(1);

}

fwrite(array, sizeof(struct record), 2, fp);

fclose(fp);

return 0;

}

#include <stdio.h>

#include <stdlib.h>

struct record {

char name[10];

int age;

};

int main(void)

{

struct record array[2];

FILE *fp = fopen("recfile", "r");

if (fp == NULL) {

perror("Open file recfile");

exit(1);

}

fread(array, sizeof(struct record), 2, fp);

printf("Name1: %s\tAge1: %d\n", array[0].name, array[0].age);

printf("Name2: %s\tAge2: %d\n", array[1].name, array[1].age);

fclose(fp);

return 0;

}

$ gcc writerec.c -o writerec

$ gcc readrec.c -o readrec

发现生成的文件recfile不能直接打开。

原因:我们把一个

struct record

结构体看作一条记录,由于结构体中有填充字节,每条记录占16字节,

把两条记录写到文件中共占32字节。该程序生成的

recfile

文件是二进制文件而非文本文件,因为其

中不仅保存着字符型数据,还保存着整型数据24和28(在

od

命令的输出中以八进制显示为030和034)。

注意,直接在文件中读写结构体的程序是不可移植的,如果在一种平台上编译运行

writebin.c

程序,

把生成的

recfile

文件拷到另一种平台并在该平台上编译运行

readbin.c

程序,则不能保证正确读出

文件的内容,因为不同平台的大小端可能不同(因而对整型数据的存储方式不同),结构体的填充方式

也可能不同(因而同一个结构体所占的字节数可能不同,

age

成员在

name

成员之后的什么位置也可能不同)。

通过readrec程序读取文件recfile的内容,说明writerec程序的确记录成功写入recfile中。

从recfile读出的内容如下:

Name1: Ken   Age1: 24

Name2: Knuth  Age2: 28

fwritefread的应用举例:

1.将一个字符串写入文件:

char *str="hello,I am a test program!";

fwrite(str,sizeof(char),strlen(str),fp)

2.将一个字符数组写入文件:

char str[]={'a','b','c','d','e'};

fwrite(str,sizeof(char),sizeof(str),fp)

3.将一个整型数组写入文件:

int a[]={12,33,23,24,12};

先计算数组元素个数nmemb,之后

fwrite(a,sizeof(int),nmemb,fp)

注:由于程序生成的文件是二进制文件而非文本文件,因此,不用机器,整数的表达不同,

所以无法直接打开生成文件。可通过fread函数检验数据是否写入文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: