无法弄清楚出了什么问题,我似乎没有从恐惧中得到任何东西。
#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
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);
}
答案 0 :(得分:6)
你在整个地方混合指针和引用。
你的函数只需要指向缓冲区:
void Read_Whole_File(char *buffer) { ... }
你应该按原样将指针传递给fread()
,不要取指针的地址:
size_t amount_read = fread(buffer, _length, sizeof *buffer, _file_pointer);
还要记住:
ptr
,则可以使用sizeof *ptr
并删除重复类型名称的需要。malloc()
。答案 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;
}
你不觉得这里有什么问题吗?如果您无法发现错误,请输入以下列表:
chr
是char
,因此buffer
是char *
malloc
。你用C语言或C ++编码?如果是C ++,请考虑使用new
wchar_t *
但buffer
为char *
malloc
时,length*2
中的length * sizeof(w_char_t)
的块。不要对类型的大小做任何假设(甚至写sizeof(char)
也没问题,它会使意图明确)for
循环从0变为length
,但由于buffer
被定义为char
的缓冲区,因此只初始化length
个字节,而你分配了length*2
个字节,所以你的缓冲区的一半仍未被初始化。 memset()
已定义为避免此类for
循环... 编码时请小心点!
答案 3 :(得分:1)
首先是几个尼特:
这不是一个人。以下几乎肯定没有做你想做的事情:
fread(&amp; buffer,_length,sizeof(chr),_ file_pointer);
chr
这里是一个指向引用的指针,因此sizeof几乎可以肯定是32或64.