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,否则返回其他值。

posted @ 2012-11-30 14:52  水上云天  阅读(522)  评论(0编辑  收藏  举报