从文件读取时出现浮点异常

问题描述 投票:0回答:1

程序应读取 2 个文件(author.dat 和 itation.dat)并将它们保存到地图和集合中; 首先它毫无问题地读取引文列表,然后它似乎正确地读取了作者,并且在遍历整个列表之后(author.dat)出现了浮点异常..无法弄清楚为什么

似乎发生在authorlist的构造函数内的author.cpp中

作者.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){}
}

作者.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

程序.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;
}
c++ iostream fstream ifstream multimap
1个回答
0
投票

我敢打赌问题是由以下代码行引起的:

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;
© www.soinside.com 2019 - 2024. All rights reserved.