fread()函数如何判断是不是到文件末尾?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fread()函数如何判断是不是到文件末尾?相关的知识,希望对你有一定的参考价值。

当用fread()函数将文件内容存到数组时,在靠近文件结尾的时候,会出现剩余的内容不足以填满数组或者已经到达结尾,这时要如何判断实际读出的数据大小?

fread(从文件流读取数据)
相关函数 fopen,fwrite,fseek,fscanf

表头文件 #include<stdio.h>

定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明 fread()用来从文件流中读取数据。
参数stream为已打开的文件指针,
参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。

Fread()会返回 实际 读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

返回值 返回实际读取到的nmemb数目。

附加说明

范例 #include<stdio.h>
#define nmemb 3
struct test

char name[20];
int size;
s[nmemb];
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);


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

========================

feof(检查文件流是否读到了文件尾)
相关函数 fopen,fgetc,fgets,fread

表头文件 #include<stdio.h>

定义函数 int feof(FILE * stream);

函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。

返回值 返回非零值代表已到达文件尾。
参考技术A 函数的原型如下
size_t fread(
void *buffer,
size_t size,
size_t count,
FILE *stream
);

fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count. Use the feof or ferror function to distinguish a read error from an end-of-file condition. If size or count is 0, fread returns 0 and the buffer contents are unchanged. If stream or buffer is a null pointer, fread invokes the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, this function sets errno to EINVAL and returns 0.

可见根据msdn,返回值表示具体读了多少出来,你根据返回值来做吧,呵呵。多看msdn

See _doserrno, errno, _sys_errlist, and _sys_nerr for more information on these, and other, error codes.

Remarks
The fread function reads up to count items of size bytes from the input stream and stores them in buffer. The file pointer associated with stream (if there is one) is increased by the number of bytes actually read. If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters. The replacement has no effect on the file pointer or the return value. The file-pointer position is indeterminate if an error occurs. The value of a partially read item cannot be determined.

This function locks out other threads. If you need a non-locking version, use _fread_nolock.

ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vccrt/html/9a3c1538-93dd-455e-ae48-77c1e23c53f0.htm本回答被提问者采纳
参考技术B fread()返回的size_t类型数值就是实际大小啊,地球人都知道了!!! 参考技术C fread()函数的返回值就是实际读取的大小
对于用fopen函数打开的文件可以用feof来判断文件指针是否已到达文件尾

c语言中fread的用法

参考技术A

  fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。下面我就跟你们详细介绍下c语言中fread的用法,希望对你们有用。

  c语言中fread的用法如下:

  #include <stdio.h>

  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 <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;

  

  /* -------------------readrec.c----------------- */

  #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

  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函数检验数据是否写入文件。

以上是关于fread()函数如何判断是不是到文件末尾?的主要内容,如果未能解决你的问题,请参考以下文章

fread函数

c语言fread函数的用法

PHP fgets 函数

c语言中fread的用法

如何使用 fread 函数读取 CSV 文件的特定行

如何使用 fread 和 fwrite 函数读写二进制文件?