C语言文件操作积累

1.有時候在使用檔案讀寫時,會遇到要判斷檔案結尾的需求,而C/C++語言在<stdio.h>中有提供一個feof()的函式幫助我們判斷,但是在使用時,請先了解它的使用時機。

下面的寫法模式會發生多讀取的case,而這個原因在於使用feof的時機不對

FILE* pf;
 while(!feof(pf)){
   //fread 讀取
   //資料處理
 }
feof是發生在fread使用"讀取過檔案"後,已讀到End-of-file位置時,回傳的指標才會是true(檔案結尾) ,所以上面的寫法在讀完最後一筆後,指標會停留在End-of-file位置前,需要再讀一次到在End-of-file位置後(判斷讀取資料失敗,因為已讀到eof),才會為true,而因為fread讀取失敗,buffer的資料不會改變,所以才會多讀一筆.

改善的方式,如先使用fread讀取,再來判斷feof,當feof判斷為true時就跳離loop

while(1){
  //fread讀取
  if(feof(pf)) break;
}

2.C语言求文件长度:

size_t fileSize = 0;

fp = fopen(filename,"rb");//注意这里一定要用二进制方式打开,若用文本方式打开会将“0d0a(回车换行)”当做一个字符

fseek(fp,SEEK_END,0);

fileSize = ftell(fp);

fseek(fp,SEEK_SET,0);//注意这里要把文件指针移动回起始位置

3.使用fread读取文件,判读读取结果应使用ferror进行

 /* Attempt to read in 100 bytes: */
      count = fread( buffer, sizeof( char ), 100, stream );
      if( ferror( stream ) )      {
         perror( "Read error" );			//perror用于打印错误信息
         break;
      }
4.C语言求文件长度的另一种方法:
struct stat buf;
int result;
FILE *fp;


/* Get the size of the file */
  fp = fopen (fileName, "r");		//不需要指定二进制方式打开
  if (fp == NULL)
    {
    return;
    }
  result = fstat (fileno (fp), &buf);	//注意使用fstat(获取文件信息)与fileno(获取文件句柄)
  if (result != 0)			//fstat执行成功则返回0,失败返回-1
    {
    fclose (fp);
    return;
    }
/* Allocate a buffer and read all into memory */
  fileSize = buf.st_size;		//得到文件长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值