使C ++代码更有效,否则语句不起作用

时间:2015-11-25 20:00:49

标签: c++ segmentation-fault iostream multiple-inheritance istream

我正在尝试从文本文件中读取一些值,并将它们存储在内存中。

这是文件可以存储或看起来像

示例1 - 存储出纳员姓名,年龄和职称的文件

* Cashier Name: Bill Age: 25 Job Title: Cashier *

示例2 - 存储出纳员姓名,年龄和职称的文件

* Cashier Name: Mark Age: 37 Job Title: Manager *

示例3 - 存储出纳员姓名,年龄,职称和所涉及领域的文件

* Cashier Name: Sam Age: 45 Job Title: Area Manager Areas Covered: Manchester, Liverpool *

示例4 - 存储出纳员姓名,年龄,职称,所涉及领域以及此人管理人员类型的文件

* Cashier Name: Dave Age: 50 Job Title: Regional Manager Areas Covered: Derby, Manchester, Liverpool Manages: Area Managers *

基本上,我正在尝试实现一个小程序,可以将收银员姓名,年龄和职称存储到.txt文件中,然后将这些值存储到内存中。我可以检索第一个和第二个示例的值,但是我在检索和存储第三个和第四个示例的值时遇到了一些困难。我的if, else if, else块似乎不起作用并且效率不高(即可以重用代码)?

这是我的代码

    istream& inputWorkers(istream& is, Workers * & workers)
    {
       char d1, d2;
       string cashName, name, cashAge, cashTitle, title, cashAreas, areas, cashManages, manages;
       int age;
       if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> d2)
   {
      *workers = Workers(name, age, title); // Segmentation error
   } 
   else if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> cashAreas >> areas >> d2)
  {
     *workers = AreaMangers(name, age, title, areas); // Segmentation error
  }
   else if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> cashAreas >> areas >> cashManages >> manages >> d2)
  {
     *workers = RegionalMangers(name, age, title, areas, manages); // Segmentation error
  }
    else
    {
    return is.setstate(badbit);
    }
    return is;
    }

我也遇到了分段错误,我不知道为什么。我试图关注YouTube视频并阅读文章。任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

我认为你的问题是你试图在测试它们时输入你的值。想想每个输入语句(在if条件中)真正起作用的内容。它会读取,直到出现错误。然后,在读取文件中的唯一行之后,转到下一行并尝试读取NEXT(不存在)行。

您可能需要做的是将整行读入一个字符串,然后从那里处理它。当然,这意味着检测关键字及其在字符串中的位置,以提取相应的子串并从那里开始。

答案 1 :(得分:0)

如果第一个if失败,则意味着从流中读取错误,并且流将处于fail状态。之后你无法读取任何其他内容(除非你重置状态)所以接下来的两个if条件也会失败,即你永远不会进入else if块。

你可能想要这样的伪代码:

read whole line into a string
split the string into whitespace-separated words
if (number of words == 8)
{
  parse words
  create Workers
}
else if (number of words == 10)
{
  parse words
  create AreaManagers
}
else if (number of words == 12)
{
  parse words
  create RegionalManagers
}

下一个问题是:

 *workers = AreaMangers(name, age, title, areas); // Segmentation error

您将类型为AreaManagers的对象分配给Workers类型的对象,这将不会达到您所期望的效果。您无法通过指定与其不同的内容来更改*workers的类型。也许你想做类似的事情:

 workers = new AreaManagers(name, age, title, areas);

但是现在你已经动态分配内存并需要正确释放它,所以最好使用智能指针,例如shared_ptr<Workers>而不是Workers*

最后,您的分配导致分段错误的事实并不好,您应该测试单独复制类型并确保它是正确的,不要只将其作为复杂的if-else语句的一部分来执行不起作用。