Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用ostream::write将char*写入二进制文件_C++_Binaryfiles_Ofstream - Fatal编程技术网

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

C++ 使用ostream::write将char*写入二进制文件,c++,binaryfiles,ofstream,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();

我正在尝试将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));
这是错误的。它只是写入指针的值。它不会写入数据

char getTestData[100];
您需要使用:

binFile.write(pData, strlen(pData));
size_t len = 0;
binFile.read(char*)&len, sizeof(len));
binFile.read(pData, len);
但是,这不足以读回数据。为了能够读回数据,您需要首先写入字符串的大小

size_t len = strlen(pData);
binFile.write((char*)&len, sizeof(len));
binFile.write(pData, len);
当读取回数据时,您需要使用:

binFile.write(pData, strlen(pData));
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;
}
void写入(std::string常量和文件名,std::string常量和数据)
{
std::of流binFile(文件名,std::ios::out | std::ios::binary);
if(binFile.is_open())
{
size_t len=data.size();
write((char*)&len,sizeof(len));
写入((char*)和数据[0],len);
//不需要。当函数返回时,文件将被关闭。
//binFile.close();
}
}
无效读取(标准::字符串常量和文件名,标准::字符串和数据)
{
std::ifstream binFile(文件名,std::ios::in | std::ios::binary);
if(binFile.is_open())
{
尺寸长度=0;
read((char*)&len,sizeof(len));
数据。调整大小(len);
读取((char*)和数据[0],len);
}
}
int main()
{
std::string file=“testData.dat”;
std::string testData=“ABCdEFG”;
写入(文件、测试数据);
std::字符串getTestData;
读取(文件,getTestData);

std::cout使用
char*
指向字符串文本是不推荐的。使用
const char*
。不要使用C-stye类型转换。使用
static\u cast
如果不起作用,你可能做错了什么。我喜欢你提出用数据存储大小的观点。我不喜欢你然后硬设置任意缓冲区来存储数据f 100字符。@NeilKirk,我不想让代码变得过于复杂。感谢pompt的回复!我很想使用std::string。但我正在为旧代码添加功能。使用std::string意味着我必须更改很多代码。