我正在尝试从文本文件中读取一些值,并将它们存储在内存中。
这是文件可以存储或看起来像
示例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视频并阅读文章。任何帮助将不胜感激。
由于
答案 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
语句的一部分来执行不起作用。