事先,对不起这个问题。我有一个项目,我正和另外三个人一起开发Intro Comp。科学。当然,我已经到了一个地方,经过几个小时的搜索和调整我的输出/功能/课程,我真的需要寻求帮助。
我们的计划是仓库购物者的俱乐部客户/库存管理器,由客户界面控制类'Members'组成,将在main中使用,其中包括几个数据类向量(俱乐部成员)类:'常规'(基础)和'执行'(派生)和项目类:'Item_Info'(派生)购买信息和库存信息的'Item'(基础)。)这是定义:
class Members{
friend class RegularMember ;
friend class ExecutiveMember ;
friend class Item ; // unnecessary? should use access functions
// all three may be unneeded
private:
vector <RegularMember*> memberList ; // one member list
vector<Item_Info> item_sales ;
vector<Item> inventory ;
ifstream inFile ;
vector<string> strFiles ;
我们使用基类指针作为'memberList'向量类型来允许多态,但是为了保持多样性,我们选择将'inventory'和'item_sales'分开可读性/功能性(项目(基础)&amp; Item_Info (派生)具有唯一的 [stock / sold]数量成员变量,它们的使用方式不同,这是最有意义的。)
进入实际错误时,我们的程序运行时有两种形式的输入:成员文件列表,包含与'memberList'相关的所有信息,以及销售文件的dayX,其中有5个并包含与'inventory'相关的所有信息&amp; 'item_sales'以及每次购买的 memberID ,将每次购买与成员相关联。我们有一个函数来读取成员输入文件并构建'memberList',并有一个函数来读取销售文件的日期,并构建库存如果它是空。我已经能够清除所有内存泄漏,条件跳转,未初始化的值以及valgrind的其他容易修复的问题。
然而,既然我的输入功能已成功完成其逻辑并输出每个库存添加,我有一个非常奇怪的问题。当我尝试简单地输出与字符串文字连接的字符串变量时:
std::cout << itemTitle << " inventory\'d\n" ;
我进入我的控制台输出:
" inventory'd"+[whatever part of the string exceeds 13 characters (the length of my string literal.)]
基本上,如果 itemTitle 是“Banana”,您将看不到“inventory'd!”之外的任何输出,但如果它是 itemTitle ,如“Panasonic”宽屏“你会看到”库存!escreen“。我已经厌倦了使用endl感觉每个可能的格式排列,因为我的第一个猜测是这是一种流缓冲问题,但我仍然不确定甚至会发生什么。在将 itemTitle 传递给其各自的对象并使用getter成员函数将其推送到其向量时,我也尝试将输出移动到执行,但无济于事。输出 getName 函数的返回结果与输出 itemTitle 变量相同。
如果有人想在输入函数上有更多的上下文,它在~85行很长,但是如果有用的话:
void Members::inputDayOfSales(int day_i) { // input day of sales file
int j, i = 0 ;
int m, d, y, quantity, tmpint ;
double memberID, price ;
string itemTitle, day = to_string(day_i), file = "day.txt" ;
file.insert(size_t(3),day) ;
inFile.open(file) ;
for(int i = 0 ; i < memberList.size() ; ++i) //valgrind errors?
memberList[i]->setSpentToday(0,day_i) ;
while (inFile >> m) {
i = 0 ;
inFile.get() ;
inFile >> d ;
inFile.get() ;
inFile >> y ;
inFile >> memberID ;
cout << endl << memberID << endl ;
inFile.ignore(100, '\n') ;
getline(inFile, itemTitle) ;
inFile >> price ;
inFile >> quantity ;
cout << "Grabbed file info block\n" ; // grabs all the data from file
while(1)
{
if(i < memberList.size())
{
if(memberList[i]->getInfo().memberID == memberID)
{
break ; // once found, break from loop
}
++i ;
}
}
cout << memberList[i]->getInfo().memberID << endl << endl ;
tmpint = memberList[i]->getSpentToday(day_i) ;
memberList[i]->setSpentToday((price * quantity), day_i) ;
memberList[i]->addtoTotalSpent(price * quantity) ;
j = 0 ;
if(!inventory.empty()) {
while(j < inventory.size()) {
if(inventory[j].getName() == itemTitle
|| j == inventory.size()-1) {
break ;
}
++j ;
}
if(inventory[j].getName() == itemTitle) {
cout << endl ;
cout << "Already inventory'd!\n" ;
Item_Info newsale ;
Date saleDate(m,d,y) ;
newsale.setPurchaseDate(saleDate) ;
newsale.setRevenue(price*quantity) ;
newsale.setSoldQuantity(quantity) ;
item_sales.push_back(newsale) ;
}
else {
newinv_l:
Item newinv ;
Item_Info newsale ;
Date saleDate(m,d,y) ;
newinv.setName(itemTitle) ;
newinv.setPrice(price) ;
newsale.setPurchaseDate(saleDate) ;
newsale.setRevenue(price*quantity) ;
newsale.setSoldQuantity(quantity) ;
item_sales.push_back(newsale) ;
inventory.push_back(newinv) ;
cout << "\n" ;
// all three are having the same issue:
//cout << itemTitle ;
//cout << newinv.getName() ;
//cout << inventory.back().getName() ;
cout << " inventory\'d!" << endl ;
}
}
else if(inventory.empty()) goto newinv_l ;
i = 0 ;
}
inFile.ignore(100, '\n') ;
inFile.close() ;
}
答案 0 :(得分:0)
将评论的推测转化为答案:
您的'\r'
字符串末尾有一个返回(itemTitle
)字符。打印时,将输出下一个字符的点移回控制台的左侧。输出时,下一个字符将覆盖打印的第一个字符。