fread在c语言中是什么意思,C语言中fread函数相当于java中的哪个函数
fread在c语言中是什么意思,C语言中fread函数相当于java中的哪个函数详细介绍
本文目录一览: C语言中fread,fwrite和fscanf,fprintf的区别,什么是格式化数据
fread:是读取数据
fwrite:是写入数据
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
注意:1 完成次写操(fwrite())作后必须关闭流(fclose());
2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
3 fprintf() : 按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是返回值为此次操作写入到文件的字节数。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字节;str2: 10字节;a:2字节;b:8字节,c为33,因为写入时不同的数据间自动加入一个空格。
4.fscanf 和 scanf 相似 :当能正常读入数据时, fscanf 返回读入数据的个数,否则返回 EOF 。
c语言中fread的用法
fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。下面我就跟你们详细介绍下c语言中fread的用法,希望对你们有用。
c语言中fread的用法如下:
#include
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录
数小于nmemb,也可能返回0。
fread用于读写记录,这里的记录是指一串固定长度的字节,比如一个int、一个结构体或者一个定长数组。参数size指出一条记录的长度,而nmemb指出要读或写多少条记录,这些记录在ptr所指的内存空间中连续存放,共占size * nmemb个字节,fread从文件stream中读出size * nmemb个字节保存到ptr中,而fwrite把ptr中的size * nmemb个字节写到文件stream中。
nmemb是请求读或写的记录数,fread和返回的记录数有可能小于nmemb指定的记录数。例如当前读写位置距文件末尾只有一条记录的长度,调用fread时指定nmemb为2,则返回值为1。如果当前读写位置已经在文件末尾了,或者读文件时出错了,则fread返回0。如果写文件时出错了,则fwrite的返回值小于nmemb指定的值。下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体
fread的例子程序如下:
/* -------------------writerec.c--------------- */
#include
#include
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;
}
/* -------------------readrec.c----------------- */
#include
#include
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
fwrite和fread的应用举例:
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函数检验数据是否写入文件。
c语言文件操作fwrite和fread
无语的写法..
你根本分不清什么事数字 什么事字符
如果你要输出txt里面的内容比较简单.
char buf[1024];
fread(&stud[j],sizeof(struct student),1,fp1);
改成
fread(buf,1024,1,fp1);
printf 改成 printf(%s, buf);
如果你要把 txt里面的字符变成数据.
那就需要解析txt了
读了你的代码,我觉得,你在用fread的时候,其实你的意图是想将1.txt中的每一行按照你所定义的structure student中的字段格式,进行读取,将你的stud一个一个填充好。很遗憾,fread并不能做这件事情。fread会将1.txt中的每行看做一整个字符串,写到你给的每个&stud[j]开头的地址空间中,而无视你所给定的structure的定义,自然你printf就得不到预想的结果了。而fwrite倒是可以原原本本将写入的字串回写出来。
如果你想要按structure的格式读入1.txt的数据,那么就要用scanf咯。就像printf那样,scanf的用法你一定是懂的。
fread是C语言标准为中的一个函数。它从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
fwrite是C语言标准库中的一个函数,指向文件写入一个数据块。示例如下:
//读取一个完整的文件#include
#include
int main(){ FILE* pFile; //文件指针 long lSize; // 用于文件长度 char* buffer; // 文件缓冲区指针 size_t result; // 返回值是读取的内容数量 pFile = fopen("myfile.bin" , "rb"); if (pFile == NULL) {fputs("File error", stderr); exit(1);} // 如果文件错误,退出1 // 获得文件大小 fseek(pFile , 0 , SEEK_END); // 指针移到文件末位 lSize = ftell(pFile); // 获得文件长度 rewind(pFile); // 函数rewind()把文件指针移到由stream(流)指定的开始处, 同时清除和流相关的错误和EOF标记 // 为整个文件分配内存缓冲区 buffer = (char*) malloc(sizeof(char) * lSize); // 分配缓冲区,按前面的 lSize if (buffer == NULL) {fputs("Memory error", stderr); exit(2);} // 内存分配错误,退出2 // 该文件复制到缓冲区 result = fread(buffer, 1, lSize, pFile); // 返回值是读取的内容数量 if (result != lSize) {fputs("Reading error", stderr); exit(3);} // 返回值如果不和文件大小,读错误 // terminate // 文件终止 fclose(pFile); free(buffer); return 0;}综合使用的例子。
#include
int main(){ FILE* pFile; float buffer[] = { 2.0 , 3.0 , 8.0 }; pFile = fopen("myfile.bin" , "wb"); // 打开文件写操作 fwrite(buffer , 1 , sizeof(buffer) , pFile); // 把浮点数组写到文件 myfile.bin fclose(pFile); // 关闭文件 float read[3]; pFile = fopen("myfile.bin" , "rb"); // 重新打开文件读操作 fread(read , 1 , sizeof(read) , pFile); // 从文件中读数据 printf("%f\t%f\t%f\n", read[0], read[1], read[2]); fclose(pFile); // 关闭文件 return 0;}
C语言中fread和fcanf从文件读取数据的区别
fread是以整体作为单位进行读取,一般是一次读取一个结构体大小的块;
fscanf是格式化的读取;读取的都是基本类型数据,所以对于一个结构体,一次需要按照类型分别读取其中的元素;
另外,对于文件末尾判定;fcanf是以EOF作为判定,
fread使用feof函数判定。
C语言的问题,fread和fgets的区别是什么?
fread()函数通常用于读取二进制数据,用它可以精确的指定要读取多少字节的数据.
fgets()函数通常用于读取ASCII文本,它的参数是一个字符数组.
fread读入的内容不包括最后的字符串终结符,而fgets则包括这个,也就是说fread读入的内容不是字符串,因为少一个终结符,而fgets则读入的是一个字符串。
至于if(p)这个问题应该很明了,虽然p是指值,但是可以让指针指向NULL,这样的话就可以使用if(p)来判断指针是否指向了内存,若没有就跳过语句。
fread和 fgets的区别:
fread :以字节位计算长度,按照指定的长度和次数读取数据,遇到结尾或完成指定长度读取后停止.
fgets :整行读取,遇到回车换行或结尾停止.在文本方式时使用.
读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
fgets(字符数组名,n,文件指针);
其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。
例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。(按行读取)fgets()每次读入一行就会指向下一行.
所以把前面10行读进去了就清除. 然后下一次fgets()就是第十一行了.
fgets()怎么每次都是读一行?你怎么设定?
fread是用于整块数据的读写函数,可用来读写一组数据,如一个数组元素,一个结构变量的值等。
读数据块函数调用的一般形式为: fread(buffer,size,count,fp),其中:
buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。
size 表示数据块的字节数。
count 表示要读写的数据块块数。
fp 表示文件指针。
例如: fread(fa,4,5,fp);
其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。
fread -- 读取文件(可安全用于二进制文件)在区分二进制文件和文本文件的系统上(如 Windows)打开文件时,fopen()
函数的 mode 参数要加上 'b'。$handle = fopen($filename, "rb");
C语言中fread函数相当于java中的哪个函数
函数原型:size_t fread(void *buffer, size_t size, size_t count, FILE *stream);fread是用来读取块数据的,主要就是结构体类型的数据。因此,它的count是结构体对象的数量,size是sizeof(struct xxx),还有就是读取二进制文件,使用fread可以...
c语言 ,fread,fwrite和fscanf,fprint不知格式化方式和二进制方式的区别
fread 和fscanf都是读函数
fwrite和fprintf都是写函数。
原理类似 以fread和fscanf对比举例
fread是不管文件中什么内容,直接读到内存中, 不考虑格式。
而fscanf在读的时候, 第一步要做的 和fread相同,先读取字符到内存中,然后要解析格式字符串,根据格式字符串,去判断读到的字符,和格式字符串是否相符,如果相符,再转换成对应的变量类型,存到参数指针中。
比如分析格式字符串为%d,那么就要判断读到的字符是不是0~9之间的,是的话 再读下一个,直到读到不是0~9之间的字符。 最后 再把读到的字符,转为整型。
由于有这些判断,转换,所以效率自然低。
至于文件打开的方式是文本或者二进制, 和使用哪个函数没太多关系
一般fscanf用于文本,而fread用于二进制。 但并非绝对,二进制也可以用fscanf,而文本也一样可以用fread的。
C语言中的fread函数读取结构体,求助大神!
18100 48200 112
I dont think you can read everything at the same time
Try read each element once a time.
int wscore;
char name[7];
把这两个换个位置试试
fread是读取2进制文件的,不要直接使用它读取文本文件,因为需要转换。
最好使用,fscanf。
如果需要提高效率,可以使用fread+sscanf或者fread+atoi
关于C语言fread的用法
scanf("%s",&filepath);
这一句就错了。应为scanf("%s",filepath);
数组名就是其地址。
先把这里改正了再说吧。
fread()的第一个参数应该是数组。你的不是。
你的是WORD,实际是short,但你却用%s输出。建议
改
typedef
struct
tagBITMAPFILEHEADER
{
WORD
bfType;
为
BYTE
bfType[100];
简介
fread
功
能:
从一个流中读数据
函数原型:
size_t
fread(
void
*buffer,
size_t
size,
size_t
count,
file
*stream
);
参
数:
1.用于接收数据的地址(指针)(buffer)
2.单个元素的大小(size)
:单位是字节而不是位,例如读取一个整型数就是2个字节
3.元素个数(count)
4.提供数据的文件指针(stream)
返回值:成功读取的元素个数
程序例
#include
int
main(void)
{
file
*stream;
char
msg[]
=
"this
is
a
test";
char
buf[20];
if
((stream
=
fopen("dummy.fil",
"w+"))
==
null)
{
fprintf(stderr,
"cannot
open
output
file.\n");
return
1;
}
/*
write
some
data
to
the
file
*/
fwrite(msg,
strlen(msg)+1,
1,
stream);
/*
seek
to
the
beginning
of
the
file
*/
fseek(stream,
0,
seek_set);
/*
read
the
data
and
display
it
*/
fread(buf,
strlen(msg)+1,
1,stream);
printf("%s\n",
buf);
fclose(stream);
return
0;
}