C++ 读取二进制文件时释放内存
我有一个二进制文件,保存我的结构:C++ 读取二进制文件时释放内存,c++,c,file,memory,fread,C++,C,File,Memory,Fread,我有一个二进制文件,保存我的结构: struct vec { string author; string name; int pages; string thread; vec *next; }; 写入文件功能: void logic::WriteInfoToFile() { if (first != NULL) { pFile = fopen(way.c_str(), "wb"); if (pFi
struct vec
{
string author;
string name;
int pages;
string thread;
vec *next;
};
写入文件功能:
void logic::WriteInfoToFile()
{
if (first != NULL)
{
pFile = fopen(way.c_str(), "wb");
if (pFile != NULL)
{
fseek(pFile, 0, SEEK_SET);
temp = first;
while (temp != NULL)
{
WriteString(temp->author,pFile);
WriteString(temp->name,pFile);
fwrite(&temp->pages,sizeof(int), 1, pFile);
WriteString(temp->thread,pFile);
temp = temp->next;
}
}
fclose(pFile);
}
}
写入srtig函数:
void logic::WriteString(string s, FILE *pFile)
{
if (pFile != NULL)
{
char *str = new char[s.length() + 1];
strcpy(str, s.c_str());
int size = strlen(str);
fwrite(&size, sizeof(int), 1, pFile);
fwrite(str, size, 1, pFile);
delete [] str;
}
}
读取文件:
void logic::ReadInfoFromFile()
{
pFile = fopen(way.c_str(), "rb");
if (pFile != NULL)
{
fseek(pFile, 0, SEEK_END);
if (ftell(pFile) != 0)
{
fseek(pFile, 0, SEEK_SET);
int check;
while (check != EOF)
//while (!feof(pFile))
{
temp = new vec;
temp->author = ReadString(pFile);
temp->name = ReadString(pFile);
fread(&temp->pages, sizeof(int), 1, pFile);
temp->thread = ReadString(pFile);
temp->next = NULL;
if (first == NULL)
{
first = temp;
first->next = NULL;
}
else
{
temp->next = first;
first = temp;
}
recordsCounter++;
check = fgetc(pFile);
fseek(pFile, -1, SEEK_CUR);
}
}
}
fclose(pFile);
}
读取字符串:
string logic::ReadString(FILE *pFile)
{
string s;
if (pFile != NULL)
{
int size = 0;
fread(&size, sizeof(int), 1, pFile);
char *str = new char[size];
fread(str, size, 1, pFile);
str[size] = '\0';
s = str;
//delete [] str; //WHY?????????!!!!!
return s;
}
else
return s = "error";
}
问题在于读取字符串函数,在这里我释放内存。“delete[]str”我在这行上看到程序崩溃
但如果我不这样做,记忆效果很好
请帮帮我 在分配
size
chars的同时覆盖size+1(使用终端'\0'),您将关闭一个。内存管理器不喜欢这样
char *str = new char[size];
fread(str, size, 1, pFile);
str[size] = '\0'
为什么要进行所有这些动态分配来编写std::string?只需使用
c_str()
和string::size()
。有关字符串的所有信息都在这两个函数中。您的代码有一些问题,主要是因为将C函数与C++代码混合。一个(次要)问题是,它不会返回int
,而是std::size\u t
。如果您学会使用,并且使用而不是char*
,许多问题都会自动消失。我这样做是因为我不知道如何将字符串写入二进制文件,长期以来,我一直受此困扰,决定在读/写fwrite时使用char*(&s.length(),sizeof(int),1,pFile);fwrite(s.c_str(),1,s.length(),1,pFile)代码>如果new[]
抛出异常会发生什么情况?@PaulMcKenzie