Исключение с плавающей точкой при чтении из файла

Программа должна прочитать 2 файла (author.dat и citation.dat) и сохранить их на карте и установить; сначала он читает список цитирования без проблем, затем он, кажется, правильно читает авторов, и после того, как он прошел весь список (author.dat), возникает исключение с плавающей запятой.. не могу понять, почему

кажется, происходит в author.cpp внутри конструктора для списка авторов

author.cpp:

#include <fstream>
#include <iostream>
#include "authors.h"

using namespace std;

AuthorList::AuthorList(char *fileName) {
    ifstream s (fileName);
    int idTemp;
    int nrTemp;
    string nameTemp;

    try {
        while (true){
            s >> idTemp >> nrTemp >> nameTemp;
            cout << idTemp << " " << nrTemp << " " << nameTemp << " test_string";
            authors.insert(std::make_pair(idTemp,Author(idTemp,nrTemp,nameTemp)));
            if (!s){
                cout << "IF-CLAUSE";
                throw EOFException();
            }
             cout << "WHILE-LOOP_END" << endl;
        }
    } catch (EOFException){}
}

author.h:

#ifndef CPP_AUTHORS_H
#define CPP_AUTHORS_H

#include <iostream>
#include <map>
#include <string>
#include "citations.h"

class Author {
public:
    Author (int id, int nr, std::string name) :
            articleID(id),
            authorNR(nr),
            authorName(name){}

    int getArticleID() const {
        return articleID;
    }

    std::string getAuthorName() const {
        return authorName;
    }

private:
    int articleID;
    int authorNR;
    std::string authorName;
};

class AuthorList {
public:
    AuthorList(char *fileName);

    std::pair<std::multimap<int,Author>::const_iterator, std::multimap<int,Author>::const_iterator> findAuthors(int articleID) {
        return authors.equal_range(articleID);
    }

private:
    std::multimap<int,Author> authors;
};

#endif //CPP_AUTHORS_H

programm.cpp:

#include <iostream>
#include <cstdlib>
#include "citations.h"
#include "authors.h"
#include "authorCitation.h"

using namespace std;

int main(int argc, char *argv[]){
    CitationList *cl;
    AuthorList *al;

    //check if argv array has its supposed length
    if (argc != 4){
        cerr << "usage: programm article.dat citation.dat author.dat";
        return EXIT_FAILURE;
    }

    //inserting citation.dat and author.dat in corresponding lists (article.dat not used)
    cl = new CitationList(argv[2]);
    al = new AuthorList(argv[3]);
    try {
        AuthorCitationList *acl;
        acl->createAuthorCitationList(al,cl);
        acl->printAuthorCitationList2File("authorcitation.dat");
    } catch (EOFException){
        cerr << "something went wrong while writing to file";
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

Все файлы: https://drive.google.com/file/d/0B734gx5Q_mVAV0xWRG1KX0JuYW8/view?usp=sharing

1 ответ

Решение

Я готов поспорить, что проблема вызвана следующими строками кода:

AuthorCitationList *acl;
acl->createAuthorCitationList(al,cl);

Вы вызываете функцию-член, используя неинициализированный указатель. Я предлагаю изменить первую строку на:

AuthorCitationList *acl = new AuthorCitationList; 

Добавьте все необходимые аргументы в конструктор.

Пока вы это делаете, измените цикл чтения данных. У тебя есть:

while (true){
    s >> idTemp >> nrTemp >> nameTemp;
    cout << idTemp << " " << nrTemp << " " << nameTemp << " test_string";
    authors.insert(std::make_pair(idTemp,Author(idTemp,nrTemp,nameTemp)));
    if (!s){
        cout << "IF-CLAUSE";
        throw EOFException();
    }
    cout << "WHILE-LOOP_END" << endl;
}

Когда вы сделаете это, вы добавите данные один раз после того, как будет достигнут конец строки. Кроме того, у вас, кажется, последняя строка в неправильном месте. Мне кажется, что это должно быть вне while петля.

Ты можешь использовать:

while (true){
    s >> idTemp >> nrTemp >> nameTemp;

    // Break out of the loop when reading the
    // data is not successful.
    if (!s){
        cout << "IF-CLAUSE";
        throw EOFException();
    }
    cout << idTemp << " " << nrTemp << " " << nameTemp << " test_string";
    authors.insert(std::make_pair(idTemp,Author(idTemp,nrTemp,nameTemp)));
}
cout << "WHILE-LOOP_END" << endl;

Вы можете упростить его, используя:

while (s >> idTemp >> nrTemp >> nameTemp){
   cout << idTemp << " " << nrTemp << " " << nameTemp << " test_string";
   authors.insert(std::make_pair(idTemp,Author(idTemp,nrTemp,nameTemp)));
}
cout << "WHILE-LOOP_END" << endl;
Другие вопросы по тегам