这门课有可能不安全吗?

时间:2015-03-12 00:40:31

标签: c++ class visual-c++ file-io binaryfiles

我已经让这个类读取二进制文件并存储他们的数据。

FileInput.h:

#pragma once

#include <Windows.h>
#include <fstream>

using namespace std;

class FileInput
{
public:
    FileInput(LPSTR Filename);
    FileInput(LPWSTR Filename);
    ~FileInput();
    operator char*();
    explicit operator bool();
    size_t Size;
private:
    __forceinline void Read();
    ifstream File;
    char* Data;
};

FileInput.cpp

#include "FileInput.h"

FileInput::FileInput(LPSTR Filename)
{
    File.open(Filename, ios::binary);
    Read();
}


FileInput::FileInput(LPWSTR Filename)
{
    File.open(Filename, ios::binary);
    Read();
}


FileInput::~FileInput()
{
    if (Data) delete[] Data;
}


FileInput::operator char*()
{
    return Data;
}


FileInput::operator bool()
{
    return (bool)Data;
}


void FileInput::Read()
{
    if (!File)
    {
        Data = nullptr, Size = 0;
        return;
    }
    File.seekg(0, ios::end);
    Size = (size_t)File.tellg();
    File.seekg(0, ios::beg);
    Data = new char[Size];
    File.read(Data, Size);
    File.close();
}

然后我像这样使用它:

FileInput File(Filename);    // This reads the file and allocates memory

if (!File)    // This is for error checking
{
    // Do something
}

if (File.Size >= sizeof(SomeType))
{
    char FirstChar = File[0];    // Gets a single character
    SomeStruct *pSomeStruct = reinterpret_cast<SomeStruct*>(&File[0]);    // Gets a structure
}

那么,这门课有可能不安全吗?

reinterpret_cast<SomeStruct*>(&File)或其他无意义的陈述不算数。

编辑:我对不安全的意思是&#34;做出意想不到的或“危险的”#39;东西&#34;

1 个答案:

答案 0 :(得分:0)

这是一个重大的矫枉过正。如果要将文件复制到缓冲区,可以使用istreambuf_iterator

std::ifstream inFile(fileName);
std::vector<char> fileBuffer ( (std::istreambuf_iterator<char>(inFile)),
                                std::istreambuf_iterator<char>() );

然后,您可以根据需要阅读fileBuffer