C ++ - 分段故障读取二进制文件

时间:2016-01-10 17:26:03

标签: c++ file

我遇到了一个问题,当我尝试在二进制文件中读取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);
}

2 个答案:

答案 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];

这样您就不必自己allocatedeallocate记忆。

确保所有字符串都以空值终止。

当然,如果练习允许,您可以使用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);
}