zoukankan      html  css  js  c++  java
  • 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,否则返回其他值。

  • 相关阅读:
    nyoj-102-次方求模
    nyoj-420-p次方求和
    nyoj-93-汉诺塔(三)
    nyoj-684-Fox Ciel
    nyoj-148-fibonacci数列(二)
    测试面试话题3: 如何做好测试团队的管理者
    测试面试话题2: 给你一个测试团队,你会如何管理?
    测试面试话题1:敏捷开发与测试
    Github: 从github上拉取别人的源码,并推送到自己的github仓库
    Docker: Harbor一些小知识
  • 原文地址:https://www.cnblogs.com/zzugyl/p/2796236.html
Copyright © 2011-2022 走看看