我正在为一个小型个人项目开发一个粗略的存储系统。我有一个结构,保存每个存储文件的数据:
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个文件(左边的原始文件),我可以看到它们确实非常不同,输出文件中几乎没有数据!
我猜这与写或读的长度有关,但我已经尝试了我能为他们想到的每一个不同的可能值,它似乎没有改变任何东西。
如果我在从原始文件中读取数据后将数据打印到控制台,它就像在书面文件中一样显示,这让我相信问题在于我如何阅读该文件,但我没有看到该部分代码有任何问题。
我如何阅读文件似乎没有读取整个文件有什么问题?
另外请原谅我在我的代码中犯的任何可怕的错误,我仍然在学习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变量报告的字节大小正确。所以现在我的猜测是,无论出于什么原因,它都没有在整个文件中阅读