如何将信息从文本文件读取到构造函数内的动态数组中?

问题描述:

要指定上面的问题,我正在上课学习C++。我们刚刚了解了动态数组和类。在最近的一个任务中,我们假设从文本文件中获取信息,并使用给定的结构和类(如下所示)初始化构造函数中动态数组的特定单元。话虽如此,我的问题是,每当我尝试运行该程序它崩溃。如何将信息从文本文件读取到构造函数内的动态数组中?

class call_record 
{ 
public: 
    string firstname; 
    string lastname; 
    string cell_number; 
    int relays; 
    int call_length; 
    double net_cost; 
    double tax_rate; 
    double call_tax; 
    double total_cost; 
}; 

class call_class 
{ 
public: 
    call_class(); 
    ~call_class(); 
    bool Is_empty(); 
    bool Is_full(); 
    int Search(const string key); 
    void Add(); 
    void Remove(const string key); 
    void Double_size(); 
    void Process(); 
    void Print(); 
private: 
    int count; 
    int size; 
    call_record *call_DB; 
}; 

// default constructor 
call_class::call_class() 
{ 

    size = 5; 
    count = 0; 
    ifstream in; 
    in.open("callstats_data.txt"); 

    while (!in.eof()) 
    { 

     if(Is_full()) 
     { 
      Double_size(); 
     } 

     in >> call_DB[count].firstname 
      >> call_DB[count].lastname 
      >> call_DB[count].cell_number 
      >> call_DB[count].relays 
      >> call_DB[count].call_length; 

     count++; 
    } 

    in.close(); 

} 

以包括更多的情况下,我发现这个问题主要出现当我尝试读入文件到一个动态数组,它是一个类的构造函数中。我尝试使用静态数组而不是动态数组,它的工作原理没有任何问题;但是,我无法真正使用静态数组。所以我想知道是否有特定的方式将信息从文本文件放置到默认构造函数内部的动态数组中。

+0

首先:更改'call_record * call_DB;''到的std ::矢量 call_DB;'有_DYNAMIC array_。 –

+0

你没有显示你的'Is_full'或'Double_size'方法,问题可能在其中之一。 while(!in.eof())'也可能会导致问题,但这些可能会表现为不良数据而不是崩溃。 –

+0

第二:心[为什么iostream :: eof里面的循环条件被认为是错误的?](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) 。 –

问题是没有为call_DB[count]分配内存;

在使用call_DB[count]之前动态或静态分配它;

例如:

call_record call_DB[5];

,而不是 call_record *call_DB;

此外,如果call_DB有一个特定的大小不要超过它去,请确保您不尝试上述分配的内存访问:

while (!in.eof() && (count < 5))

如果你使用STL声明call_DB std :: vector,那么你将避免以上的保护,你的向量将根据需要增长。

std::vector<call_record> call_DB;

记得使用所需的包含文件:

#include <vector>