C++ 从文件c++;

C++ 从文件c++;,c++,file-io,while-loop,C++,File Io,While Loop,我正在尝试建立一个清单系统,它从一个列表中读取数据,并以并行向量存储数据。我的向量在我的代码中包含的类中设置为公共成员。文本文件如下所示 1111 Dish Washer 20 250.50 550.50 2222 Micro Wave 75 150.00 400.00 3333 Cooking Range 50 450.00 850.00 4444 Circular Saw 150 45.00 125.00 6236 Tacos 200 5.00 5.50 这是我的密码 int main

我正在尝试建立一个清单系统,它从一个列表中读取数据,并以并行向量存储数据。我的向量在我的代码中包含的类中设置为公共成员。文本文件如下所示

1111
Dish Washer
20 250.50 550.50
2222
Micro Wave
75 150.00 400.00
3333
Cooking Range 
50 450.00 850.00
4444
Circular Saw
150 45.00 125.00
6236
Tacos
200 5.00 5.50
这是我的密码

 int main()
{
    char choice;
    Inventory Stocksheet(5); // the included list has 5 items if a text file has more then it should scale fine
    int id, ordered;
    string name;
    double manuprice, price;
    ifstream data;
    data.open("Inventory Data.txt");
    if (data.fail())
    {
        cout << "Data sheet failed to open \n";
        exit(1);
    }
    while (data >> id )
    {
        Stocksheet.itemID.push_back(id);
        getline(data,name);
        Stocksheet.itemName.push_back(name); // this is where my code fails
        data >> ordered;
        Stocksheet.pOrdered.push_back(ordered);
        Stocksheet.pInstore.push_back(ordered);
        data >> manuprice;
        Stocksheet.manuPrice.push_back(manuprice);
        data >> price;
        Stocksheet.sellingPrice.push_back(price);
    }

    do
    {
        cout << "     Your friendly neighborhood tool shack\n";
        cout << "Select from the following options to proceed \n";
        cout << "1. Check for item \n";
        cout << "2. Sell an iem \n";
        cout << "3. Print Report \n";
        cout << "Input any number other than 1,2 or 3 to exit \n";
        cout << "Selection : ";
        cin >> choice; // think about sstream here
        switch (choice)
        {
        case '1': checkforitem(Stocksheet);
            break;
        case '2': sellanitem(Stocksheet);
            break;
        case '3': printthereport(Stocksheet);
            break;
        default: cout << " ^-^ Exiting the shop. Have a fantastic day! ^-^ \n";
            break;
        }

    }while ((choice == '1') || (choice == '2') || (choice == '3'));
    data.close();
    return 0;
}
intmain()
{
字符选择;
库存库存清单(5);//如果文本文件中包含的项目多于此数量,则包含的列表中有5个项目
int-id,有序;
字符串名;
双倍价格,双倍价格;
ifstream数据;
打开(“Inventory data.txt”);
if(data.fail())
{
cout>id)
{
库存单。项目id。推回(id);
getline(数据、名称);
Stocksheet.itemName.push_back(name);//这就是我的代码失败的地方
数据>>有序;
库存单。打包。推回(订购);
库存单。pInstore。推回(订购);
数据>>价格;
股票价格表。manuPrice。推回(manuPrice);
数据>>价格;
股票价格表。卖出价格。回推(价格);
}
做
{

cout当你使用
操作符时,你会得到一个“word”类型的东西。它会在空白处停止。因此,当你调用
getline
时,它会读取第一行末尾的换行符(上面有id)并停止。因此你的
名称
为空


您可以调用
data.ignore()在切换到<代码> GETLION>代码>,这将处理换行符。小心混合<代码> >代码>运算符>代码> GETLION>代码>。它不做你所期望的。

不会发布答案,因为它有点偏离你的要求:你可能想考虑把数据分解成类似于VE的东西。线的向量,这将更容易处理(任意线的随机访问变得轻而易举),特别是如果你将来需要做更多这样的操作。@WilliamKappler我不知道该怎么做。我刚刚了解了向量是什么。到目前为止,我对向量唯一的了解是我的实验室老师说“不,您不能使用向量或结构,您必须使用数组”向量基本上是一个数组,但更友好的是作为类实现,具有托管大小调整和以后确定大小的功能。您可以计算需要存储的行数(应为
\n
字符数+1)调整一个<代码> STD::vector <代码>,然后在写入每个连续元素的向量时,读取到每个代码> \n>代码,直到你到达了输入的末尾。本质上,你需要一个C++版本的PHP的代码>
。我说这可能是你的问题,因为它从一个完全不同的编程轨道开始。OMFG这就像一个魅力!除了我使用了
数据。忽略()
现在,我的循环遍历了这5个项目,并将它们推到正确的位置,我可以继续调试这个程序。非常感谢!哦,我必须在
getline()
中使用给定的文件,其中一些名称用空格分隔,因此我需要获取整个程序thing@Hikari抱歉,是的,
data.ignore()
。我忘了你在处理一个文件,而不是
cin
。我会编辑答案,以便稍后清楚。我不怪你使用
getline
,这是必要的,但这只是一个让人讨厌的怪癖。为了不那么烦人,更一致,你可以尝试
scanf
,而不是混合。这不是真正的“怪癖”“在一般情况下,当它在做唯一明智的事情时,计算机可以做。你真正应该做的是通过
getline
读取所有行,并根据需要单独解析/转换它们。