【问题标题】:Initializing array of objects with data from text file使用文本文件中的数据初始化对象数组
【发布时间】:2009-11-09 21:25:12
【问题描述】:

当我尝试在 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

【问题讨论】:

  • “系统错误”的具体内容是什么?

标签: c++ arrays file initialization


【解决方案1】:

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

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

【讨论】:

  • 我重新安排了 while 循环,并在读取 double 后使用 fileIn.ignore() 丢弃了行尾。到目前为止,我们还没有学习矢量,所以我尽量坚持讲座中涵盖的材料。将来我一定会按照您的建议尝试使用矢量。
【解决方案2】:

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

然后,您在文本文件中偏离了一行,并尝试将标题转换为双精度。这会使 fstream 发出错误信号,然后你就有麻烦了。

Brett 说得对,带有 push_back 的向量在这里是更好的解决方案。

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

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

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

【讨论】:

    【解决方案3】:

    key必须在

    的内容中
    #include "Book.h"
    

    我复制粘贴了您的代码,并将 #include 替换为我对 Book 类的假设:

    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 中的一些简单定义开始(如上)并开始阅读代码,直到找到导致问题的行。这是解决问题的粗略方法,但有时是最直接的方法。

    【讨论】:

    • 这很有趣,因为正如我提到的,如果我手动初始化数组,它会起作用。
    猜你喜欢
    • 2016-10-16
    • 2014-11-29
    • 1970-01-01
    • 2013-02-04
    • 2018-06-22
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多