关于向量:读取C ++的条形码文件

Barcode file reading c++

论坛。在上周分配的实验室里,我呆了几天。假设这是一个实验室,我们将为用作POS(销售点)系统的程序编写代码,使用户可以将商品放入购物车,并在结帐时显示订购的每个商品,价格,数量和总计。

这是分配要求的更详细列表,因此您可以了解整个情况:

  • 除文件名外,此实验室中没有任何全局变量或全局常量。

  • 您的程序必须读取存储在文件LabData.txt中的清单数据,并将数据加载到4个单独的向量中:

    • 一种。条形码的1个向量
    • b。 1个矢量用于产品说明
    • C。 1个可用向量(库存)
    • d。单价1个向量(必须包含2个小数的价格
      从文件中读取的位置)不使用矢量将为您赚取零
      对于本实验室。这些是并行向量。
  • 当前提供的数据文件有4个项目。文件格式为:条形码,项目描述,库存数量和
    单价您必须在要使用的文件中再添加2个项目。采用
    在您的家庭中发现的真实物品,以便存储真实条形码和
    产品名称。您可以确定价格和可用数量。
    创建数据时,请使用此网站测试您是否有效
    条形码:http://www.searchupc.com您的文件必须包含6个项目。
    但是请记住,您的程序将使用以下文件进行测试:
    可以包含更少或更多的项目,因此请勿将您的程序限制为
    具体数量的项目。

  • 创建一个名为ReadDataFile的函数,该函数从文件中读取数据
    并将数据存储在向量中。数据文件必须从
    C:\temp\。您可以通过任何方式为此功能指定原型
    对您有意义,但必须至少包含两个参数。该功能
    应该从main调用,以将数据加载到向量中。

  • 在主要中,提示用户输入他/她想要的商品的条形码(或名称)
    购买(确定一个用户友好的提示)。你必须只有一个cin
    为此,您的程序必须知道条形码或项目名称是
    进入并据此进行操作。强烈推荐(但是不推荐
    需要),您编写了单独的函数来处理以下某些问题
    场景:

    • 一种。如果该项目不在项目列表中,则显示错误消息,然后
      允许用户继续购物。
    • b。如果所需项目在列表中,请提示如何
      许多用户想要购买并验证您是否有足够的单位
      库存出售,否则显示相应的错误消息。
    • C。如果有足够的库存单位,请减少数量
      从向量中可用的数量购买并添加条形码
      购买到购物车的商品和数量。您可以使用任何
      您希望存储购物车数据的数据结构。记住
      该程序将在屏幕上将购物车打印到屏幕上
      完成并且用户没有固定数量的项目
      采购。
    • d。用户可能想购买更多单位的商品
      已购买(已经在购物车中)。在这种情况下,您的程序
      应该更新购物车和库存中的数量
      向量。
    • e。允许用户继续购买商品,直到他/他输入9999
      作为条形码/商品名称。 9999是结帐的标记。当这个
      发生时,显示购物车中存储的物品:

      • 一世。条码
      • ii。产品描述
      • iii。数量
      • iv。项目总计(数量*价格)此输出必须由
        调用一个单独的函数。您可以决定功能
        名称,原型,输出格式等。必须在
        至少一个论点。
  • 用户结帐购物车后,主要显示总计。
    您可以选择格式和适当的用户友好消息。

  • 记录所有功能
  • 不关闭文件
  • 那就是作业要求。

    现在,我已经为程序制作了矢量,但我在理解如何获取矢量以读取文本文件以及使用文本文件的内容准确获取用户输入项目方面遇到了问题。

    到目前为止,这是我的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void ReadDataFile(vector<string>&, vector <double>&, vector <int>&, vector <string>&);
    int main()
    {
    vector<string>bar_code;
    vector<double>unit_price;
    vector<int>inventory_quantity;
    vector<string>item_description;

    ReadDataFile(bar_code, unit_price, inventory_quantity, item_description);
    system("Pause");
    return 0;}

    void ReadDataFile(vector<string>&bar_code, vector <double>& unit_price,
    vector <int>& inventory_quantity, vector <string>& item_description)
    {
    string Bar_code;
    int Unit_price;
    double Inventory_quantity;
    string Item_description;

    ifstream inputfile;
    inputfile.open("C:\\Temp\\data.txt");
    while (!inputfile.eof())
    {
        inputfile >> Bar_code;
        bar_code.push_back(Bar_code);

        inputfile >> Unit_price;
        unit_price.push_back(Unit_price);

        inputfile >> Inventory_quantity;
        inventory_quantity.push_back(Inventory_quantity);

        inputfile >> Item_description;
        item_description.push_back(Item_description);


    }
    }

    这也是需要阅读的前四项所提供的文本文件:

    367730154604 Pringles 20 1.50

    0164000031190 Sour 10 2.50

    391360056850 Onion 35 2.97

    040255682427 Potato 23 2.98

    提前非常感谢您!


    首先,更改数据结构,以免不必要地笨拙和容易出错。 这是2015年:

    使用结构:

    1
    2
    3
    4
    5
    6
    7
    8
    struct Record {
        string bar_code;
        double unit_price;
        int inventory_quantity;
        string item_description;
    };

    vector<Record> ReadDataFile();

    接下来,通过读取所有行(getline)并使用istringstream提取各个字段来实现流提取。

    永远不要使用while (!s.eof())

    现场演示

    Live on Coliru

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <sstream>
    #include <iterator>

    using namespace std;

    struct Record {
        string bar_code;
        double unit_price;
        int inventory_quantity;
        string item_description;

        friend ostream& operator<<(ostream&, Record const&);
    };

    vector<Record> ReadDataFile();

    int main() {
        auto data = ReadDataFile();

        copy(data.begin(), data.end(), ostream_iterator<Record>(std::cout,"
    "
    ));
    }

    vector<Record> ReadDataFile() {
        vector<Record> data;

        ifstream inputfile("C:\\Temp\\data.txt");

        size_t linenumber = 0;
        string line;
        while (getline(inputfile, line)) {
            linenumber += 1;

            Record r;
            istringstream iss(line);

            if (iss >> r.bar_code >> r.item_description >> r.inventory_quantity >> r.unit_price)
                data.push_back(r);
            else
                throw runtime_error("Parse error in line #" + to_string(linenumber) +" '" + line +"'");
        }

        return data;
    }

    ostream& operator<<(ostream& os, Record const& r) {
        return os << r.bar_code <<"" << r.item_description <<"" << r.inventory_quantity <<"" << r.unit_price;
    }

    将输入打印回输出。