使用 ostream::write 将 char* 写入二进制文件
Writing char* to binary file using ostream::write
我正在尝试将 char* 写入二进制文件。
这就是我现在拥有的。
void Write(char* fileName, char* pData)
{
ofstream binFile (fileName, ios::out | ios::binary);
if (binFile.open())
{
binFile.write((char*)&pData, sizeof(pData));
binFile.close();
}
}
void Read(char* fileName, char* pData)
{
ifstream binFile(fileName, ios::in | ios::binary);
if(binFile.open())
{
binFile.read(char*)&pData, sizeof(pData));
binFile.close
}
}
int main()
{
char* testData = "ABCdEFG"; // not real data
char* getTestData;
char* file = "C:\testData.dat";
Write(file, testData);
Read(file, getTestData);
}
测试数据的长度未知。可能并不总是相同的。
当我运行程序一次,又写又读。我可以取回测试数据。
但是当我停止程序并再次 运行 时,这次没有写。只是阅读,我无法取回测试数据。
我真的不明白这里发生了什么。
有人可以向我解释一下吗?
binFile.write((char*)&pData, sizeof(pData));
错了。它只是写入指针的值。它不写入数据。
您需要使用:
binFile.write(pData, strlen(pData));
但是,这不足以读回数据。为了能够读回数据,您需要先写入字符串的大小。
size_t len = strlen(pData);
binFile.write((char*)&len, sizeof(len));
binFile.write(pData, len);
并且在读回数据时,需要使用:
size_t len = 0;
binFile.read(char*)&len, sizeof(len));
binFile.read(pData, len);
然后,null 终止字符串。
pData[len] = '[=14=]';
PS
确保 getTestData
在使用它读取数据之前已正确初始化。
char getTestData[100];
足以满足您的测试用例。
更新
您可以使用 std::string
而不是 char*
使您的程序更好一些。当使用 std::string
时,可以更轻松地管理保存数据的大小。
void Write(std::string const& fileName, std::string const& data)
{
std::ofstream binFile(fileName, std::ios::out | std::ios::binary);
if (binFile.is_open())
{
size_t len = data.size();
binFile.write((char*)&len, sizeof(len));
binFile.write((char*)&data[0], len);
// No need. The file will be closed when the function returns.
// binFile.close();
}
}
void Read(std::string const& fileName, std::string& data)
{
std::ifstream binFile(fileName, std::ios::in | std::ios::binary);
if(binFile.is_open())
{
size_t len = 0;
binFile.read((char*)&len, sizeof(len));
data.resize(len);
binFile.read((char*)&data[0], len);
}
}
int main()
{
std::string file = "testData.dat";
std::string testData = "ABCdEFG";
Write(file, testData);
std::string getTestData;
Read(file, getTestData);
std::cout << getTestData << std::endl;
}
我正在尝试将 char* 写入二进制文件。
这就是我现在拥有的。
void Write(char* fileName, char* pData)
{
ofstream binFile (fileName, ios::out | ios::binary);
if (binFile.open())
{
binFile.write((char*)&pData, sizeof(pData));
binFile.close();
}
}
void Read(char* fileName, char* pData)
{
ifstream binFile(fileName, ios::in | ios::binary);
if(binFile.open())
{
binFile.read(char*)&pData, sizeof(pData));
binFile.close
}
}
int main()
{
char* testData = "ABCdEFG"; // not real data
char* getTestData;
char* file = "C:\testData.dat";
Write(file, testData);
Read(file, getTestData);
}
测试数据的长度未知。可能并不总是相同的。
当我运行程序一次,又写又读。我可以取回测试数据。
但是当我停止程序并再次 运行 时,这次没有写。只是阅读,我无法取回测试数据。
我真的不明白这里发生了什么。 有人可以向我解释一下吗?
binFile.write((char*)&pData, sizeof(pData));
错了。它只是写入指针的值。它不写入数据。
您需要使用:
binFile.write(pData, strlen(pData));
但是,这不足以读回数据。为了能够读回数据,您需要先写入字符串的大小。
size_t len = strlen(pData);
binFile.write((char*)&len, sizeof(len));
binFile.write(pData, len);
并且在读回数据时,需要使用:
size_t len = 0;
binFile.read(char*)&len, sizeof(len));
binFile.read(pData, len);
然后,null 终止字符串。
pData[len] = '[=14=]';
PS
确保 getTestData
在使用它读取数据之前已正确初始化。
char getTestData[100];
足以满足您的测试用例。
更新
您可以使用 std::string
而不是 char*
使您的程序更好一些。当使用 std::string
时,可以更轻松地管理保存数据的大小。
void Write(std::string const& fileName, std::string const& data)
{
std::ofstream binFile(fileName, std::ios::out | std::ios::binary);
if (binFile.is_open())
{
size_t len = data.size();
binFile.write((char*)&len, sizeof(len));
binFile.write((char*)&data[0], len);
// No need. The file will be closed when the function returns.
// binFile.close();
}
}
void Read(std::string const& fileName, std::string& data)
{
std::ifstream binFile(fileName, std::ios::in | std::ios::binary);
if(binFile.is_open())
{
size_t len = 0;
binFile.read((char*)&len, sizeof(len));
data.resize(len);
binFile.read((char*)&data[0], len);
}
}
int main()
{
std::string file = "testData.dat";
std::string testData = "ABCdEFG";
Write(file, testData);
std::string getTestData;
Read(file, getTestData);
std::cout << getTestData << std::endl;
}