-1

セグメンテーション エラーが発生した場所がわかりません。以下は私のコードです。

#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <list>
#include <iomanip>
#include <stdexcept>
using namespace std;

class isbn
{
    private:
        string *code;
        int digit;
        isbn *current, *next;

    public:

    //constructor
    isbn(): code(NULL), digit(0) { }

    //copy constructor
    isbn(const isbn &other):
        code(new string[other.digit]),
        digit(other.digit)
        {
        for(int i=0; i < digit; i++)    
            code[i] = other.code[i];
        }
    //destructor
    ~isbn()
    {
        if(digit>0) delete [] code;
    }
    //set up the private values 
    void setCode(char *temp, int num);
    void setDigit(const int &num);

    //return the value of the pointer character 
    const string &getCode(int num) const;
    const unsigned int getDigit() const;

    //assignment operator
    isbn operator = (const isbn &other)
    {
        code = new string[other.digit];
        digit = other.digit;
        for(int i=0; i < digit; i++)    
            code[i] = other.code[i];
        return *this;
    }
    //equal operator for a digit
    bool operator == (const isbn &other) const
    {
        return code == other.code;
    }

};

const string& isbn::getCode(int num) const
{
    return code[num];
}
const unsigned int isbn::getDigit() const
{
    return digit;
}
void isbn::setCode(char *temp, int num) 
{
    if (num<0 || num >= digit)
    {
        throw out_of_range("error occurred from setCode");
    }
    code[num] = temp;
}
void isbn::setDigit(const int &num)
{
    digit = num;
}

void extIsbn_in_file(list<isbn> &isbns, const string &filename)
{
    ifstream filein;
    filein.clear();
    filein.open(filename.c_str());
    if(!filein)
    {
        cout << "Unable to open file to read \n";
        exit(0);
    }
    cout << "\n file : " << filename << "\n";
    cout << "\n";

    char *contents;
    isbn aisbn;
    list<isbn>::iterator isbnitr;
    isbnitr = isbns.begin();
    int count = 0;

    while(!filein.eof())
    {
        filein.getline(contents, '\n');
        cout << contents << '\n';
        aisbn.setCode(contents, count);
        aisbn.setDigit(count);
        isbns.push_back(aisbn);
        count++;
    }
    filein.close();
}

int main(int argc, char *argv[])
{
    if(argc > 0)
    {
        if(argc != 2)
        {
            cout << "Error: the num of arguments should be 2";
            exit(0);
        }
    list<isbn> code;
    extIsbn_in_file(code, argv[1]);
    }
    else
    {
        cout << "invalid number of argument!! \n";
        exit(0);
    }
    return 0;
}

以下のコードがセグメンテーション違反エラーをドラッグしていると推測してください。私がセットアップしたコンストラクターが正しいかどうかはわかりません。間違っている場合、どうすれば修正できますか?

    while(!filein.eof())
    {
        filein.getline(contents, '\n');
        cout << contents << '\n';
        aisbn.setCode(contents, count);
        aisbn.setDigit(count);
        isbns.push_back(aisbn);
        count++;
    }
4

2 に答える 2

1

char *contents; を初期化する必要があります。heap に割り当てられたメモリに。または std:: 文字列を使用します。ありがとう@Jaochim

于 2013-04-16T07:19:48.963 に答える
1

ヒント:filein.getline(contents, '\n');期待どおりの動作をしません。意図的にソリューション全体を提供するわけではありません。学習には役立ちませんが、代わりに読んでください:http://www.cplusplus.com/reference/istream/istream/getline/

于 2013-04-16T07:01:46.080 に答える