fopen、fseek、fread、fclose

2024-03-01 13:48
文章标签 fopen fseek fread fclose

本文主要是介绍fopen、fseek、fread、fclose,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FILE文件流用于对文件的快速操作,主要的操作函数有fopen、fseek、fread、fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满足编程中的需要。以下分别进行说明,还有他们使用时的注意事项

fopen

函数原型    FILE * fopen(const char *path,cost char *mode)

作用:打开一个文件,返回指向该文件的指针

参数说明:第一个参数为欲打开文件的文件路径及文件名,第二个参数表示对文件的打开方式

注:mode有以下值:

r:只读方式打开,文件必须存在

r+:可读写,必须存在

rb+:打开二进制文件,可以读写

rt+:打开文本文件,可读写

w:只写,文件存在则文件长度清0,文件不存在则建立该文件

w+:可读写,文件存在则文件长度清0,文件不存在则建立该文件

a:附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,EOF符保留

a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留

wb:打开二进制文件,只写

wb+:打开或建立二进制文件,可读写

wt+:打开或建立文本文件,可读写

at+:打开文本文件,可读写,写的数据加在文本末尾

ab+:打开二进制文件,可读写,写的数据加在文件末尾

由mode字符可知,上述如r、w、a在其后都可以加一个b,表示以二进制形式打开文件

返回值:文件打开了,返回一个指向该打开文件的指针(FILE结构);文件打开失败,错误上存error code(错误代码)

注意:在fopen操作后要进行判断,是否文件打开,文件真正打开了才能进行后面的读或写操作,如有错误要进行错误处理

例:FILE *pfile=fopen(const char *filename,"rb");

打开文件流还有一个支持宽字符的函数,如下

FILE *_wfopen(const wchar_t *filename,const wchar_t *mode)

fread

函数原型:size_t fread(void* buff,size_t size,size_t count,FILE* stream)

作用:从文件中读入数据到指定的地址中

参数:第一个参数为接收数据的指针(buff),也即数据存储的地址

第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节

第三个参数为元素个数,即要读取的数据大小为size的元素个素

第四个参数为提供数据的文件指针,该指针指向文件内部数据

返回值:读取的总数据元素个数

例:

int  num,count;

int* pr=new int[num*count];

fread(pr, num*4, count, stream);   // stream为fopen中返回的FILE指针

要将数据写入pr中,必须为pr分配内存,一个int为4个字节,所以要x4

fseek

函数原型:int fseek(FILE *stream,long offset,int framewhere)

作用:重定位文件内部的指针

参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置

返回值:重定位成功返回0,否则返回非零值

需要注意的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我们感兴趣的数据上,重定位主要是这个目的

说明:执行成功,则stream指向以fromwhere为基准,偏移offset个字节的位置。执行失败(比方说offset偏移的位置超出了文件大小),则保留原来stream的位置不变

fclose

函数原型:int fclose(FILE *stream)

功能:关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

熟练使用以上四个函数可以从文件中获取对我们有用的数据型,前提对于文件格式很了解,比如,对于一个DIB位图文件,就可以读取出他的文件中的头信息和像素点信息。

一:函数名: fwrite

  功 写内容到流中

  用 :fwrite(buffer,size,count,fp);

  (1buffer:是一个指针,对fwrite来说,是要输出数据的地址。

  (2size:要写入的字节数;

  (3count:要进行写入size字节的数据项的个数;

  (4fp:目标文件指针。

  程序例:

#include <stdio.h>struct mystruct{int i;char ch;};int main(void){FILE *stream;struct mystruct s;if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */{fprintf(stderr, "Cannot open output file.\n");return 1;}s.i = 0;s.ch = 'A';fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */fclose(stream); /* close file */return 0;}

fprintf的区别

fprintf(fp, "%d", buffer); 是将格式化的数据写入文件
fprintf(文件指针,格式字符串,输出表列); 

fwrite(&buffer, sizeof(int), 1, fp);是以二进位位方式写入文件
fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针); 

由于fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;100,占3个字节,10000,占5个字节
所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,10010000所占空间也是4个字节。所以二进制写入比格式化写入更省空间。

因此,
对于1 2 3 4 5 6 7 8 9 0 十个整数,用fprintf写入时,占10个字节;而用fwrite写入时,占40个字节。
对于100 101 102 103 104 105 106 107 108 109 110 这十个整数,用fprintf写入时,占30个字节;而用fwrite写入时,占40个字节。
对于10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000 这十个整数,用fprintf写入时,占50个字节;而用fwrite写入时,还是占40个字节。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#define N 5
struct student
{
char name[20];
int num;
int age;
char addr[15];
};
int main()
{
/*数据块读写函数fread和fwite
读取数据块函数调用的一般形式为
fread(buffer,size,count,fp)
写数据块函数调用的一般形式为
fwrite(buffer,size,count,fp)
其中:
buffer是一个指针,在fread函数中,它表示存入数据的首地址;
在fwrite函数中,它表示输出数据的首地址
size表示数据块的字节数
count表示要读写的数据块的块数
fp表示文件指针
fread(array,4,10,fp)
表示从fp所指的文件中,每次读4个字节(一个实数)送入实数数组array中,
连续读取10次,即读10个实数到数组array中
从键盘输入N个学生的数据,写入一个文件中,再读出这N个学生的数据显示到屏幕上
*/
struct student stua[N],stub[N],*pp=stua,*qq=stub;
FILE *fp;int i;
if((fp=fopen("c:\\happy.txt","w+"))==NULL)
{ 
printf("Cannot open file,press any key exit!\n");
getch();
exit(1);
}
printf("Iput data \n");
for(i=0;i<N;i++,pp++)
{
printf("请输入第%d位学生的数据:",i+1);
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
}
pp=stua;
fwrite(pp,sizeof(struct student),N,fp);//写N个学生的记录
rewind(fp);
fread(qq,sizeof(struct student),N,fp);//读N个学生的记录
printf("\n\n name number age addr \n");
for(i=0;i<N;i++,qq++)
printf("%-10s%-6d%-5d%-15s\n",qq->name,qq->num,qq->age,qq->addr);
fclose(fp);
return 0;
}




这篇关于fopen、fseek、fread、fclose的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762655

相关文章

error C4996: 'fopen': This function or variable may be unsafe.

今天在vs2013编程中遇到这样的错误:error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details

fgets()和fread()函数

fgets(): fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To d

编译出错信息:错误    1    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   首

fopen()函数的使用(转)

http://www.cnblogs.com/devil-91/archive/2012/05/29/2523572.html 定义函数FILE * fopen(const char * path,const char * mode);函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。 mode有下列几种形态字符串: r 打开只读文件,该文件

glibc fread函数源码剖析

最近看APUE,看到了fread函数,就把之前想分析的一个函数借这个机会研究一下。 先写个程序,调用一下fread函数。 #include <stdio.h>int main(){char strbuf[12];FILE* fp;fp = fopen("./temp","r");fread(strbuf,sizeof(char),11,fp);return 0;} 好了,还是咱们的

MATLAB 中,fopen 和 fgetl 函数用于文件操作

逐行读文件内容 fopen 和 fgetl 读结构体 在 MATLAB 中,fopen 和 fgetl函数用于文件操作。 fopen 用于打开一个文件并返回一个文件标识符,而 fgetl 用于从该文件中读取一行文本。 对于 MATLAB R2018b 版本,这些函数的用法没有显著变化,所以我可以为你解释你给出的代码段。 matlabfp = fopen(files(i).name);

fopen w和 w+属性的区别

w”和“w+”属性: 1、相同点:都会将已存在的文件内容清空; 2、不同点:“w”,在fopen后,只能能进行写操作,如果写完后读文件,则必须首先要先fclose(fd);然后重新fopen(fd,"r"); "w+",则可以在写入数据之后,接着进行读数据;(顺序不能反,因为w属性会将文件内容清空)。 注意:“w+”在进行写操作之后,需要调整文件指针再进行读操作,因为此时文件指针是在末尾处

linux之popen、open、fopen

1,popen:每次fread都要重新做popen,否则值不刷新。 //linux在应用层输出设备节点值日志char bat_vol_get[16] = {0};char bat_percentage_get[16] = {0};while(1){sleep(3);FILE

fread/fwrite函数返回值问题

函数原型: #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是需要读取的数据元素个数; size是每个元素字节长;

fopen和fprintf函数的使用

#include<stdio.h>#include<string>using namespace std;#define F_PATH "E:\\梁栋凯\\example\\fopen\\fopen\\liang.txt"int main(void){FILE *fp=NULL; //创建文件指针fp=fopen(F_PATH,"w+");if(NULL==fp){r