我遇到了一个问题,当我尝试在二进制文件中读取char* professeur
时,它失败了,在read()
函数中给出了一个分段错误。奇怪的是,对于其他类中的所有其他load
函数来说,阅读char*
成员的工作正常但对于这一个,即使professeur
在I中正确写入得了一个段错误。
所以这是代码:
Cours.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#include "Liste.h"
#include "Event.h"
#include "Professeur.h"
class Cours: public Event
{
private:
char* professeur;
Liste<int> groupes;
public:
void save(ofstream&) const;
void load(ifstream&);
};
Cours.cpp
void Cours::save(ofstream& o) const
{
int n=strlen(professeur);
char buff[60], *buff2;
o.write((char *)&n, sizeof(int));
strcpy(buff, getProfesseur());
o.write(buff, n+1);
groupes.save(o);
Event::save(o);
}
void Cours::load(ifstream& i)
{
int n;
char buff[60];
i.read((char *)&n, sizeof(int));
cout<<"n: "<<n<<endl;
if(i.read(buff, n+1))//seg fault
{
strcpy(professeur, buff);
cout<<"prof: "<<professeur<<endl;
}
else
cout<<"erreur read prof cours"<<endl;
groupes.load(i);
Event::load(i);
}
答案 0 :(得分:3)
n
以确保它不会比缓冲区大。
在save()
:
int n=strlen(professeur);
n
此处应为最多59个 - 需要进行检查。
在load()
:
i.read((char *)&n, sizeof(int));
最好在这里检查n
(最多59个)。
此外:
int n=strlen(professeur);
char buff[60], *buff2;
o.write((char *)&n, sizeof(int));
strcpy(buff, getProfesseur());
o.write(buff, n+1);
使用两个不同的值来写入数据:strlen(professeur)
然后getProfesseur()
。
您也不为professeur
分配内存(至少在显示的代码中没有)。因此strcpy(professeur, buff);
中的load()
也会失败。
你也可以改变:
private:
char* professeur;
到
private:
char professeur[60];
这样您就不必自己allocate
和deallocate
记忆。
确保所有字符串都以空值终止。
当然,如果练习允许,您可以使用string
代替(string professeur;
),并使用<<
将数据流入和流出>>
。
答案 1 :(得分:2)
首先你读取名字的长度。为var objify = function() {
var rv = {};
for (var i = 0; i < arguments.length; i+=2)
rv[arguments[i]] = arguments[i+1];
return rv;
}
objify("name", "filler")
分配char
名为/0
的{{1}}长+1。从文件读取到目标并在末尾添加\0
:
void Cours::load(ifstream& i)
{
int n;
i.read((char *)&n, sizeof(int));
cout<<"n: "<<n<<endl;
if ( n <= 0 )
return;
professeur = new char[n+1]; // allocate professeur
if ( i.read( professeur, n ) ) // read directly to professeur
{
professeur[ n ] = ´\0`; // write \0 at end of name
cout<<"prof: "<<professeur<<endl;
}
else
{
delete [] professeur;
professeur = nullptr;
cout<<"erreur read prof cours"<<endl;
}
groupes.load(i);
Event::load(i);
}