这几天学习过程中遇见这样一个问题:
使用fread() 和 read() 的时候
short int *pRec = 0;
CFileException fileException;
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;
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,否则返回其他值。