C open fopen read fread

这几天学习过程中遇见这样一个问题:

使用fread() 和 read() 的时候

CFile myfile;
short  int *pRec = 0
CFileException fileException; 
pszFileName="E:\\66.wav";

numSamples = 176400;
if ( !myfile.Open(pszFileName, CFile::modeRead, &fileException) )
    {
        TRACE( "Can't open file %s, error = %u\n",
            pszFileName, fileException.m_cause );
    } 
myfile.Read((void*)pRec,numSamples); 

这样是没有错误的。

换做: 

 short int *pRec = 0;

char* pszFileName;
CFile myfile;
FILE * stream;
CFileException fileException;
int numSamples =  176400;
stream = fopen( " E:\\66.wav "" r ");
if (stream == NULL) 
{
    printf( " Cannot open output file.\n ");
}
pRec =  new  short  int [numSamples/ 2];
memset(pRec, 0,numSamples);

int iReadLen = fread(( void*)pRec, 1,numSamples,stream);    
if (iReadLen ==  0)
{ printf( " 读取文件错误!!! ");}
if (feof(stream))
{printf( " 读取结束EOF!!! ");}
if (ferror(stream))
{printf( " 读取错误ferror!!! ");}

 这里就报错了。提示只读取了90000多个值。而我的66.wav有55MB。

 纠结半天 其中fopen语句改为

stream = fopen( " E:\\66.wav " " rb " );

 就正常了。

原来"r"将文件当做文本读取了,遇到EOF直接读取结束了。

而"rb",当做二进制流来读,就持续读下去了。 

 

 以下转自 http://www.lofter.com/tag/fread()

fopen()、fwrite()、fread()和fseek()详解

1,fopen():

定义函数:文件指针名=fopen(文件名,文件使用方式)

函数说明:文件使用方式主要有以下几种,括号中是文件使用方式的意义:

“rt”  (只读打开一个文本文件,只允许读数据)

“wt” (只写打开或建立一个文本文件,只允许写数据)

“at”  (追加打开一个文本文件,并在文件末尾写数据)

“rb”  (只读打开一个二进制文件,只允许读数据)

“wb” (只写打开或建立一个二进制文件,只允许写数据)

“ab”  (追加打开一个二进制文件,并在文件末尾写数据

“rt+” (读写打开一个文本文件,允许读和写)

“wt+”(读写打开或建立一个文本文件,允许读写)

“at+” (读写打开一个文本文件,允许读,或在文件末追加数据)

“rb+” (读写打开一个二进制文件,允许读和写)

“wb+”(读写打开或建立一个二进制文件,允许读和写)

“ab+” (读写打开一个二进制文件,允许读,或在文件末追加数据)

        如果成功的打开一个文件, fopen()函数返回文件指针, 否则返回空指针(NULL),由此判断文件打开是否成功。

2,fwrite(将数据写至文件流) 

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

函数说明:fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。

返回值:返回实际写入的nmemb数目。

3,fread(从文件流读取数据)

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

函数说明:fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

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

4,fseek(重定位流上的文件指针)

定义函数:int fseek(FILE *stream, long offset, int fromwhere);

函数说明:第一个参数stream为文件指针,  第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移  第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR(当前位置)、 SEEK_END(文件结尾)或 SEEK_SET(文件开头), 其中SEEK_SET,SEEK_CUR和SEEK_END的值依次为0,1和2。

简言之:

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

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

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

 返回值: 成功,返回0,否则返回其他值。

转载于:https://www.cnblogs.com/zzugyl/archive/2012/11/30/2796236.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值