malloc指针函数传递fread

时间:2009-12-11 07:10:21

标签: c++ c

无法弄清楚出了什么问题,我似乎没有从恐惧中得到任何东西。

port.h

#pragma once
#ifndef _PORT_
    #define _PORT_
    #include <string>
    #ifndef UNICODE
        typedef char chr;
        typedef string str;
    #else
        typedef wchar_t chr;
        typedef std::wstring str;
        inline void fopen(FILE ** ptrFile, const wchar_t * _Filename,const wchar_t * _Mode)
        {
            _wfopen_s(ptrFile,_Filename,_Mode);
        }
    #endif
#endif

在main()

    File * f = new File(fname,FileOpenMode::Read);
    chr *buffer;
    buffer = (wchar_t*)malloc(f->_length*2);
    for(int i=0;i<f->_length;i++)
    {
      buffer[i] = 0;
    }
    f->Read_Whole_File(buffer);
    f->Close();
    for(int i=0;i<f->_length;i++)
    {
      printf("%S",buffer[i]);
    }
    free(buffer);

在文件类

    void Read_Whole_File(chr *&buffer)
    {
        //buffer = (char*)malloc(_length);
        if(buffer == NULL)
        {
            _IsError = true;
            return;
        }
        fseek(_file_pointer, 0, SEEK_SET);
        int a = sizeof(chr);
        fread(&buffer,_length ,sizeof(chr) , _file_pointer);            
    }

4 个答案:

答案 0 :(得分:6)

你在整个地方混合指针和引用。

你的函数只需要指向缓冲区:

void Read_Whole_File(char *buffer) { ... }

你应该按原样将指针传递给fread(),不要取指针的地址:

size_t amount_read = fread(buffer, _length, sizeof *buffer, _file_pointer);

还要记住:

  • 如果您有某种类型的指针ptr,则可以使用sizeof *ptr并删除重复类型名称的需要。
  • 如果您已经知道文件的长度,请将其传递给该函数,这样您就不需要计算两次了。
  • 在C中,不要转换malloc()
  • 的返回值
  • 在进行内存分配和I / O时检查错误,可能会失败。

答案 1 :(得分:3)

buffer是对chr *的引用。然而你正在阅读&buffer这是一个chr **(无论是什么)。错。

您甚至不需要在Read_Whole_File中传递对缓冲区的引用,只需使用常规指针。

答案 2 :(得分:2)

除了原来的问题......

来自您的代码:

typedef char chr;

chr *buffer;
buffer = (wchar_t*)malloc(f->_length*2);
for(int i=0;i<f->_length;i++)
{
  buffer[i] = 0;
}
你不觉得这里有什么问题吗?如果您无法发现错误,请输入以下列表:

  • chrchar,因此bufferchar *
  • 您正在使用malloc。你用C语言或C ++编码?如果是C ++,请考虑使用new
  • 您分配的缓冲区已明确投放到wchar_t *bufferchar *
  • 当您使用malloc时,length*2中的
  • 您正在分配一个大小为length * sizeof(w_char_t)的块。不要对类型的大小做任何假设(甚至写sizeof(char)也没问题,它会使意图明确)
  • for循环从0变为length,但由于buffer被定义为char的缓冲区,因此只初始化length个字节,而你分配了length*2个字节,所以你的缓冲区的一半仍未被初始化。
  • memset()已定义为避免此类for循环...

编码时请小心点!

答案 3 :(得分:1)

首先是几个尼特:

  • malloc和免费有什么关系?新的和删除有什么问题?你显然在这里写C ++,所以写C ++
  • 在wchar_t的情况下,fopen,fseek,fread超载困扰我,非常。好多了:使用模板,或定义自己的功能。不要重载那些属于C的名称。

这不是一个人。以下几乎肯定没有做你想做的事情:

  

fread(&amp; buffer,_length,sizeof(chr),_ file_pointer);

chr这里是一个指向引用的指针,因此sizeof几乎可以肯定是32或64.