使用文本文件中的数据初始化对象数组

时间:2009-11-09 21:25:12

标签: c++ arrays file initialization

当我尝试在Visual C ++ 2008 Express上编译下面的代码时出现系统错误。我要做的是用文件读取数据初始化对象数组。我认为while循环中有一些错误,因为当我在没有while循环的情况下手动初始化这些对象时,它似乎有效。这是代码和文本文件:

#include <iostream>
#include <string>
#include "Book.h"

using namespace std;            

int main()
{
    const int arraySize = 3;
    int indexOfArray = 0;

    Book bookList[arraySize];
    double tempPrice;//temporary stores price
    string tempStr;//temporary stores author, title


    fstream fileIn( "books.txt" );

    while ( !fileIn.eof( ))
    {
        getline(fileIn,tempStr);
        bookList[indexOfArray].setAuthor(tempStr);

        getline(fileIn,tempStr);
        bookList[indexOfArray].setTitle(tempStr);

        fileIn >> tempPrice;
        bookList[indexOfArray].setPrice(tempPrice);

        if ( indexOfArray < arraySize ) //shifting array index while not exceeding array size
            indexOfArray++;
    }

    fileIn.close();

    return 0;
}

和文本文件:

Author1
Book1
23.99
Author2
Book2
10.99
Autho3
Book3
14.56

3 个答案:

答案 0 :(得分:5)

看起来你正试图在循环中写入bookList [3]。每次都会循环三次填充数组递增indexOfArray。这将使indexOfArray保持在3 - 你写入的条件将允许indexOfAray增加到3.然后,如果你的数据文件中的“14.56”后面有换行符,你将再次循环并尝试传递一个空字符串到bookList [indexOfArray] .setAuthor()导致段错误,因为indexOfArray超过了数组的末尾。

我建议放弃硬编码数组并使用std :: vector代替。在每个循环开始时,只需使用push_back()将新书添加到向量的末尾,然后使用back()访问数组中的新元素。

答案 1 :(得分:2)

您的代码中还有另一个运行时错误:您没有通过调用fileIn >> tempPrice;读取整行。对getline()的下一次调用将读到该行的末尾,因此当您期待作者时,您将获得一个空字符串。

然后您在文本文件中关闭了一行,并尝试将标题转换为双精度。这会使fstream信号出错,之后就会遇到麻烦。

Brett是对的,带有push_back的向量是一个更好的解决方案。

Brett还正确地指出,如果您的文件有额外的行,您可能会遇到错误。您可以通过检查是否已成功读取文件来解决此问题:

if(fileIn >> tempPrice)
{
    bookList[indexOfArray].setPrice(tempPrice);
}
else
{
    break;
}

if(!getline(fileIn,tempStr))
{
    break;
}

答案 2 :(得分:0)

密钥必须在

的内容中
#include "Book.h"

我复制粘贴了你的代码,并用我对类Book的外观的假设取代了#include:

class Book
{
    std::string auth;
    std::string title;
    double price;
public:
    void setAuthor(std::string& str)
    {
        auth = str;
    }

    void setTitle(std::string& t) 
    {
        title = t;
    }

    void setPrice(double d)
    {
        d = price;
    }
};

并编译。也许你可以分享你的Book.h,或者在那里寻找任何问题?从Book中的一些简单定义开始(如上所述)并开始读取代码,直到找到导致问题的行。它是解决问题的粗略方法,但有时是最直接的方式。