0

解决方案可能是微不足道的,但我在 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);

此外,我不得不提到,在我的文件中有很多不可打印的值。

4

2 回答 2

2

您的代码假定文件包含终止'\0'字符,以将字符数组转换为字符串。这个终结器是要strlen()寻找的,所以如果它不存在,你必须添加它。

可以确定的一种方法是malloc()(顺便说一下,在 C++ 中应该是new[]或者更高级的)1 个字符超过file_size,并'\0'在加载后将其设置为。

此外,您必须检查分配和 I/O 是否成功。

于 2013-03-13T16:00:17.680 回答
1

永远不要malloc在 C++ 中使用;这是一个C主义。

选项1

改为使用new

buffer = new char[filesize]

完成后,您必须使用它delete[]来释放内存。

选项 2

您也不应该在 C++ 中使用原始指针(好吧,如果您知道自己在做什么并且 100% 感觉良好,喝了一杯好咖啡并且通常很勇敢,那么您可以使用)。

在这种情况下,我想我会使用std::vector<char>.

std::vector<char> buffer(filesize);
iffile.read(&buffer.front(), filesize);

这样,std库会为您管理内存。

于 2013-03-13T16:01:48.150 回答