解决方案可能很简单但我在cpp中并不生动。
执行代码后,function strlen((char*)buffer)
的值高于我的假设。这是为什么?我该如何解决?
(if filesize=48, than strlen((char*)buffer)=64
,也应该是48!)
ifstream iffile;
iffile.open(argv[1], ios::in | ios::binary | ios::ate);
if (iffile.is_open())
{
long filesize = iffile.tellg();
if (filesize > 0)
{
iffile.seekg(0, ios::beg);
{
long pos = iffile.tellg();
if (pos != filesize)
{
char *buffer;
buffer = (char *)malloc(filesize * sizeof * buffer);
if (buffer != NULL)
{
memset(buffer, 0, filesize - pos);
iffile.read((char *)buffer, filesize);
此外,我必须提到在我的文件中有很多不可打印的值。
答案 0 :(得分:2)
您的代码假定该文件包含终止'\0'
字符,以将字符数组转换为字符串。这个终结符是strlen()
查找的内容,所以如果不存在,则必须添加它。
可以肯定的一种方法是malloc()
(顺便说一句,应该是new[]
或C ++中比较漂亮的东西)比file_size
多一个字符,并将其设置为{{ 1}}加载后。
此外,您必须检查分配和I / O是否成功。
答案 1 :(得分:1)
永远不要在C ++中使用malloc
;这是一个C-ism。
改为使用new
;
buffer = new char[filesize]
完成后,必须使用delete[]
解除分配内存。
你也不应该在C ++中使用原始指针(好吧,如果你知道自己在做什么并且感觉100%,喝一杯好咖啡并且通常很勇敢,你就可以。)
在这种情况下,我想我会使用std::vector<char>
。
std::vector<char> buffer(filesize);
iffile.read(&buffer.front(), filesize);
这样,std
库可以为您管理内存。