使用ostream :: write将char *写入二进制文件

时间:2015-11-30 04:22:45

标签: c++ binaryfiles ofstream

我正在尝试将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);
}

测试数据的长度未知。可能并不总是一样的。

当我运行程序一次,然后写和读。我可以取回测试数据。

但是当我停止程序并再次运行时,这次没有写入。只是阅读,我无法取回测试数据。

我真的不明白这里发生了什么。 有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:6)

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] = '\0';

<强> 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; } 时,可以更轻松地管理保存数据的大小。

{{1}}