将文件数据加载到内存中并将其保存回来

时间:2017-10-06 06:45:51

标签: c++ file io

我正在为一个小型个人项目开发一个粗略的存储系统。我有一个结构,保存每个存储文件的数据:

struct AssetTableRow {
    std::string id = "Unnamed"; // a unique name given by the user
    std::string guid = ""; // a guid generated based on the file data, used to detect duplicate files 
    std::string data; // binary data of the file
};

我像这样加载一个文件:

std::streampos size;
char* memblock;

std::ifstream file(filePath, std::ios::in | std::ios::binary | std::ios::ate);
if (file.is_open()) {
    size = file.tellg();
    memblock = new char[size];
    file.seekg(0, std::ios::beg);
    file.read(memblock, size);
    file.close();
    AssetTableRow row = AssetTableRow();

    row.id = "myid";
    row.guid = "myguid";
    row.data = std::string(memblock);

    AssetTable.push_back(row);
}

然后尝试将其写回我使用过的文件:

std::ofstream file(destPath, std::ios::out | std::ios::binary);
if (file.is_open()) {
    printf("Writing...\n", id.c_str());
    // I think this is where it might be messing up
    file.write((row.data.c_str(), row.data.c_str().size()); 
    file.close();
    printf("Done!\n", id.c_str());
}

现在,当我尝试打开已写出的文件(.png精灵表)时,照片查看器告诉我它无法打开该类型的文件(但打开原始文件很好)。

如果我打开Notepad ++中的2个文件(左边的原始文件),我可以看到它们确实非常不同,输出文件中几乎没有数据!

Photo data comparison

我猜这与写或读的长度有关,但我已经尝试了我能为他们想到的每一个不同的可能值,它似乎没有改变任何东西。

如果我在从原始文件中读取数据后将数据打印到控制台,它就像在书面文件中一样显示,这让我相信问题在于我如何阅读该文件,但我没有看到该部分代码有任何问题。

我如何阅读文件似乎没有读取整个文件有什么问题?

另外请原谅我在我的代码中犯的任何可怕的错误,我仍然在学习c ++并且不完全理解它的某些部分,所以我的代码可能不是最好的。

修改

根据超人对字符串的建议,我改变了我的代码,使用char *来代替数据。

struct AssetTableRow {
    std::string id = "Unnamed"; // a unique name given by the user
    std::string guid = ""; // a guid generated based on the file data, used to detect duplicate files 
    char* data; // binary data of the file
};

并更改了读取功能,以便它读取结构的数据成员:

std::ifstream file(actualPath, std::ios::in | std::ios::binary | std::ios::ate);
if (file.is_open()) {

    AssetTableRow row = AssetTableRow();

    size = file.tellg();
    row.data = new char[size];
    file.seekg(0, std::ios::beg);
    file.read(row.data, size);
    file.close();

    row.id = "myid";
    row.guid = "myguid";

    printf("%s\n", row.data);
}

但是当我使用字符串时,我仍然看到相同的输出,所以现在我更加困惑为什么会发生这种情况。

EDIT2:

经过进一步调查,我发现读取文件的size变量报告的字节大小正确。所以现在我的猜测是,无论出于什么原因,它都没有在整个文件中阅读

0 个答案:

没有答案