Classify order

How can I save the orders by daily and weekly basis to a file

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
class orderSystem
{
protected:
		int  order,ch,choice,total=0;
		string y, ye;				
public:
	void menu();
	void Time();
	void show();
};
void orderSystem::Time()
{
  time_t t = time(NULL);
  tm* timePtr = localtime(&t);
  const char * weekday[] = { "Sunday", "Monday",
                             "Tuesday", "Wednesday",
                             "Thursday", "Friday", "Saturday"};
                             
  const char * month[] = { "Jan", "Feb","Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"};
  mktime(timePtr);
  
							 								 	
  cout << timePtr->tm_hour<<":";
  cout <<  timePtr->tm_min;	 	
  cout <<  weekday[timePtr->tm_wday]<<" "; 
  cout <<  month[timePtr->tm_mon]<<" ";
  cout <<  timePtr->tm_mday<<" "; //day of the month
  cout <<  timePtr->tm_year+1900 << endl;
  
}
void orderSystem::menu()
	
{
			string fname, lname;
			char hnum[MAX_HNUM], street[MAX_STREET], city[MAX_CITY];	
			int postal;

			fstream file;
								file.open("Daily.txt", ios::in | ios::out | ios::app);
							    if(!file)
							    {
							      cout<<"Error in creating file.."<<endl;
							      	exit (-1);
							    }
			
			
			ofstream write;
				write.open("RecentOrderReceipt.txt");
				if(!write)
					{
						cout<<"file can not open"<<endl;
						exit (-1);
					}
				
				menu:
				
			
				cout<<"\n\n\tOne order at a time, Maximum of 10 order per person." <<endl;
			   	cout<<"\tENTER YOUR ORDER: "; 
			    cin>>ch;
			    
			

			   switch(ch)
			   {
			   	case 1:
			   		cout<<"\n\n\tHOW MANY Lemon Pepper Wings YOU WANT :";
			   		cin>>order;
			   		total=total+144*order;
			   		cout<<"\n\n\tLemon Pepper Wings : Php 144.00"<<endl;
			   		cout<<"\t  QUANTITY: "<<order<<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		write<<"Lemon Pepper Wings : Php 144.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		file<<"Lemon Pepper Wings - 144 x " <<order<<endl;
					cout<<"\n\tYOU ORDERED Lemon Pepper Wings"<<endl
						<<"\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
			 		
			   

			   	break;
			   	
			   	case 2:
			   		cout<<"\n\n\tHOW MANY Bufallo Wings do you want? :";
			   		cin>>order;
				
					total=total+144*order;
			   		cout<<"\n\n\tBuffalo Wings : Php 144.00"<<endl;
			   		cout<<"\tQuantity: "<<order<<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		
			   		write<<"Buffalo Wings : Php 144.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		
			   		file<<"Buffalo Wings - 144 x " <<order<<endl;
			   		
			  	 	cout<<"\n\n\n\tYOU ORDER  Buffalo Wings "<<endl
					   	<<"\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
			  		
			  	
			   		break;
			   	
			   	case 3:
			   		cout<<"\n\n\tHOW MANY Teriyaki Wings  YOU WANT :";
			   		cin>>order;
				
					total=total+144*order;
			   		cout<<"\n\n\tTeriyaki Wings : Php 144.00"<<endl;
			   		cout<<"\tQuantity: "<<order<<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		
			   		write<<"Teriyaki Wings: Php 144.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		
			   		file<<"Teriyaki Wings - 144 x " <<order<<endl;
			   		
					cout<<"\n\n\n\t\t\tYOU ORDER  Teriyaki Wings "<<endl
						<<"\t\t\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
		
					
			   		break;
			   	
			   	case 4:
			   	
			   		cout<<"\n\n\tHOW MANY Spaghetti YOU WANT :";
			   		cin>>order;
			   	
			   		total=total+75*order;
			   		cout<<"\n\n\tSpaghetti : Php 75.00"<<endl;
			   		cout<<"\tQuantity: "<<order<<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		write<<"Spaghetti: Php 75.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		file<<"Spaghetti - 75 x " <<order<<endl;
				   cout<<"\n\n\n\t\t\tYOU ORDER  Spaghetti "<<endl
				   		<<"\t\t\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
					
				
			   	break;
			   	
			   	case 5:
			   		cout<<"\n\n\tHOW MANY Fries YOU WANT:";
			   		cin>>order;
					
			   		total=total+44*order;
			   		cout<<"\n\n\tFries: Php 44.00"<<endl;
			   		cout<<"\tQuantity: "<<order<<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		write<<"Fries : Php 44.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		file<<"Fries - 44 x " <<order<<endl;
			   		cout<<"\n\n\n\t\t\tYOU ORDER  Fries "<<endl<<"\t\t\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
			 		
			 		
			   	break;
			   			   		
			   	case 6:
			   		
			   		cout<<"\n\n\tHOW MANY Iced Tea YOU WANT :";
			   		cin>>order;
			   		
			
			   		total=total+45*order;
			   		cout<<"\n\n\tIced Tea: Php 45.00";
			   		cout<<" \n";
			   		cout<<"\tQuantity: "<<order;
			   		cout<<"\n";
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		write<<"Iced Teaa: Php 45.00";
			   		write<<" \n";
			   		write<<"\tQuantity: "<<order;
			   		write<<"\n";
			   		file<<"Iced Tea - 45 x " <<order;
			   		file<<"\n";
			   		cout<<"\n\n\n\t\t\tYOU ORDER  Iced Tea "<<endl<<"\t\t\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
			   	
			   		break;
			   	
			   	case 7:
			   		
			   		cout<<"\n\n\tHOW MANY Soda YOU WANT :";
			   		cin>>order;
			   		
			   		total=total+40*order; 
			   		cout<<"\n\n\tSoda: Php 40.00" <<endl;
			   		cout<<"\tQuantity: "<<order <<endl;
			   		cout<<"\n\t\tSubtotal: " <<total <<endl;
			   		write<<"Soda: Php 40.00"<<endl;
			   		write<<"\tQuantity: "<<order<<endl;
			   		file<<"Soda - 40 x " <<order<<endl;
					cout<<"\n\n\n\t\t\tYOU ORDER  Soda "<<endl<<"\t\t\tYOUR ORDER SUCCESSFULLY SAVED "<<endl;
					
			   		break;
			   	
			   	case 8:
			   		cout<<"\n\t\t\t\t\t THANK YOU FOR USING OUR ORDERING SYSTEM!!";
			   		exit(0);
			  	 	break;
			   	
			   	default:
			   		cout<<"\n\n\t\t\t\t\t\t\tYOU ENTER WRONG ORDER KEY !!!!! "<<endl;
			   		break;
			   
				}		
				  	
					cout<<"\n\tDO YOU WANT ANOTHER ORDER (yes/no): ";
			  		cin>>y;
			 		  if(y=="yes"|| y=="YES")
			  	 	{
			  	 	goto menu;
			  	 	}   
			   else
			   {	
			   		billout:	
			   		system("cls");
			   		cout<<"\n\tTHANK YOU FOR YOUR ORDER :) "<<"GENERATING BILL "<<endl;
			   		cout<<endl;
			   		cout<<"\n\tENTER YOUR NAME (First name, Last name): ";
					cin>>fname >>lname;
			   		cout<<"\n\tENTER THE HOUSE NUMBER: ";
			   		cin.ignore();
					cin.getline(hnum,MAX_HNUM);
					cout<<"\n\tENTER THE STREET: ";
					cin.getline(street, MAX_STREET);
					cout<<"\n\tENTER THE CITY: ";
					cin.getline(city,MAX_CITY);				
					cout<<"\n\tENTER POSTAL ID: ";
					cin>>postal;
					cout<<endl;
					cout<<"\n";
				
				
				
				  					write<<"\nNAME: "<<fname <<" "<<lname<<endl;
			   						write<<"ADDRESS: "<<hnum <<" "<< street <<" St. "<< city <<" "<<postal<<" " <<endl<<endl; 
									
			                        write<<"TOTAL BILL IS : "<<total<<endl;
			                        write.close();
			                        
			                      
			                        file<<"\nNAME:"<<fname <<" "<<lname<<endl;
			   						file<<"ADDRESS: "<<hnum <<" "<< street <<" St. "<< city <<" " <<postal<<" " <<endl<<endl; 
			                        file<<"TOTAL BILL IS : "<<total<<endl;
									file<<"--------------------------------------------------------------------------------"<<endl;
			                        file.close();
			                    	
			   	for(int a=1;a<10;a++) // Change 'a<?' to how many * you want
				{
					Sleep(500);
					cout << "...";
				}
			   		cout<<"\n\t\t\t\t\t\t\t";
			   	
			   	
		
		system("cls");
						cout<< "================================================================================================="<<endl;
						cout<< "                                 Food Ordering System                                            "<<endl;
						cout<< "================================================================================================="<<endl;
						cout<< endl;
						cout<< endl;
                       	Time();
						cout<< "NAME:"<<fname <<" " <<lname <<endl;
   						cout<< "ADDRESS: "<<hnum[MAX_HNUM] <<" "<< street[MAX_STREET] <<" Street "<<  city[MAX_CITY] <<" " <<postal<<" " <<endl; 
						cout<< endl;
                       	cout<< "The orders is already in the file."<<endl;
                        cout<< "TOTAL BILL: "<<total<<endl;
				      	cout<< "================================================================================================="<<endl;
				      	getch();
 	 }
   
   system("cls");
   order-=10;
   total-=total;
   show();
}
Last edited on
A couple of things.
1. When writing code, use only spaces for indentation. Hard tab characters will end up being interpreted as 8 spaces at some point (someone else's editor, printout, document, webpage), and your code starts to look messy. Mixing spaces and tabs is a recipe for a visual mess at some point.
You can set most code editors to automatically indent using only spaces.

2. The first thing you need to fix is your monster 250+ line menu system.
If you're using copy/paste, then you need to look closely at the edits you make after the first paste. The changes you make should either
- be parameters to a generalised function.
- be placed into a table to be indexed by a generalised function.

3. You need to have a clearer idea of what your classes are. A single monster class 'OrderSystem' is trying to do way too much all by itself.

So an example.
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <ostream>
#include <string>
#include <vector>
#include <cctype>
#include <ctime>
using namespace std;

struct Item {
  string    name;               // What is it called
  int       unit_price;         // how much one of them costs
  void show(ostream &os) const {
    os << name << " " << unit_price << endl;
  }
};

const Item  items[] = {
  { "",                   0 },    // so we can number from 1
  { "Lemon Pepper Wings", 144 },
  { "Bufallo Wings",      144 },
  { "Teriyaki Wings",     144 },
  { "Spaghetti",          75 },
  { "Fries",              44 },
  { "Iced Tea",           45 },
  { "Soda",               40 },
};
const size_t num_items = sizeof(items)/sizeof(items[0]);


class Customer {
  string  first_name, last_name;  // Who are they
  int     house_number;           // Where do they live?
  string  street, city;
  int     postal_code;
public:
  // methods
  void input() {
    cout<<"\n\tENTER YOUR NAME (First name, Last name): ";
    cin>>first_name >>last_name;
    cout<<"\n\tENTER THE HOUSE NUMBER: ";
    cin>>house_number;
    cin.ignore();
    cout<<"\n\tENTER THE STREET: ";
    getline(cin,street);
    cout<<"\n\tENTER THE CITY: ";
    getline(cin,city);
    cout<<"\n\tENTER POSTAL ID: ";
    cin>>postal_code;
    cin.ignore();
  }
  void show(ostream &os) const {
    os << first_name << endl
       << last_name << endl
       << house_number << " " << street << endl
       << city << " " << postal_code << endl;
  }
};

class Order {
  time_t        time_of_order;    // The time the order was placed
  Customer      customer;         // The customer details
  vector<Item>  items;            // The things they ordered
  vector<int>   quantities;       // and how many of them
  int           total_paid;       // the grand total
public:
  // methods
  Order( ) {
    time_of_order = time(NULL);
    total_paid = 0;
  }
  void set_customer(void) {
    customer.input();
  }
  void add_item(const Item &item, int quantity) {
    items.push_back(item);
    quantities.push_back(quantity);
    total_paid += quantity * item.unit_price;
  }
  void show(ostream &os) const {
    tm* timePtr = localtime(&time_of_order);
    os << asctime(timePtr);
    customer.show(os);
    for ( size_t i = 0 ; i < items.size() ; i++ ) {
      os << quantities[i] << " * ";
      items[i].show(os);
    }
    os << "Total=" << total_paid << endl;
  }
};

void menu() {
  Order order;
  char  answer;
  cout << "Welcome to the restaurant"<< endl;
  do {
    cout << "The menu" << endl;
    for ( size_t i = 1 ; i < num_items ; i++ ) {
      cout << i << " ";
      items[i].show(cout);
    }
    cout<<"\tOne order at a time, Maximum of 10 order per person." <<endl;
    cout<<"\tENTER YOUR ORDER: ";
    int item_number;
    cin >> item_number; cin.ignore();
    cout<<"\tHOW MANY " << items[item_number].name << " do you want? :";
    int quantity;
    cin >> quantity; cin.ignore();
    order.add_item(items[item_number], quantity);
    cout<<"\tDO YOU WANT ANOTHER ORDER (yes/no): ";
    cin >> answer; cin.ignore();
  } while ( tolower(answer) == 'y' );

  cout<<"\tTHANK YOU FOR YOUR ORDER :) "<<"GENERATING BILL "<<endl;
  order.set_customer();
  order.show(cout);
}

int main ( ) {
  menu();
}


$ ./a.out 
Welcome to the restaurant
The menu
1 Lemon Pepper Wings 144
2 Bufallo Wings 144
3 Teriyaki Wings 144
4 Spaghetti 75
5 Fries 44
6 Iced Tea 45
7 Soda 40
	One order at a time, Maximum of 10 order per person.
	ENTER YOUR ORDER: 2
	HOW MANY Bufallo Wings do you want? :3
	DO YOU WANT ANOTHER ORDER (yes/no): y
The menu
1 Lemon Pepper Wings 144
2 Bufallo Wings 144
3 Teriyaki Wings 144
4 Spaghetti 75
5 Fries 44
6 Iced Tea 45
7 Soda 40
	One order at a time, Maximum of 10 order per person.
	ENTER YOUR ORDER: 5
	HOW MANY Fries do you want? :2
	DO YOU WANT ANOTHER ORDER (yes/no): y
The menu
1 Lemon Pepper Wings 144
2 Bufallo Wings 144
3 Teriyaki Wings 144
4 Spaghetti 75
5 Fries 44
6 Iced Tea 45
7 Soda 40
	One order at a time, Maximum of 10 order per person.
	ENTER YOUR ORDER: 7
	HOW MANY Soda do you want? :1
	DO YOU WANT ANOTHER ORDER (yes/no): n
	THANK YOU FOR YOUR ORDER :) GENERATING BILL 

	ENTER YOUR NAME (First name, Last name): fred flintstone

	ENTER THE HOUSE NUMBER: 42

	ENTER THE STREET: rock street

	ENTER THE CITY: bedrock

	ENTER POSTAL ID: 1234
Sat May  1 11:38:54 2021
fred
flintstone
42 rock street
bedrock 1234
3 * Bufallo Wings 144
2 * Fries 44
1 * Soda 40
Total=560


@salem c Thank you fixing my classes!
Last edited on
1
2
3
4
5
6
7
8
9
10
void write(vector<Item> items, vector<int> quantities)
  {
  	ofstream file;
  	file.open("Daily.txt");	
	for(int i=0; i<items.size();i++)
	{
		file<<quantities[i]<<" * "<<items[i]<<endl;
	 } 
	 file.close();
  }


I tried doing this for writing to file but I am having this error
[Error] cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&
in line 7
Last edited on
Well you can either:

1. Output the members yourself (since it's a struct)
 
file<<quantities[i]<<" * "<<items[i].name << " " items[i].unit_price <<endl;


2. Use the show method, as I did on line 85.

3. Overload << in the struct.
1
2
3
4
5
6
7
8
9
10
11
struct Item {
  string    name;               // What is it called
  int       unit_price;         // how much one of them costs
  void show(ostream &os) const {
    os << name << " " << unit_price << endl;
  }
  friend ostream &operator<<(ostream &os, const Item &item) {
    os << item.name << " " << item.unit_price;
    return os;
  }
};



> void write(vector<Item> items, vector<int> quantities)
So you don't make lots of copies of things, you can do
void write(const vector<Item> &items, const vector<int> &quantities)
@salem c Thank you again I tried that option 2 by implementing

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
void menu() {
  Order order;
  ofstream file("Receipt.txt");
  char  answer;
  cout << "Welcome to the restaurant"<< endl;
  do {
    cout << "The menu" << endl;
    for ( size_t i = 1 ; i < num_items ; i++ ) {
      cout << i << " ";
      items[i].show(cout);
    }
    cout<<"\tOne order at a time, Maximum of 10 order per person." <<endl;
    cout<<"\tENTER YOUR ORDER: ";
    int item_number;
    cin >> item_number; cin.ignore();
    cout<<"\tHOW MANY " << items[item_number].name << " do you want? :";
    int quantity;
    cin >> quantity; cin.ignore();
    order.add_item(items[item_number], quantity);
    cout<<"\tDO YOU WANT ANOTHER ORDER (yes/no): ";
    cin >> answer; cin.ignore();
  } while ( tolower(answer) == 'y' );

  cout<<"\tTHANK YOU FOR YOUR ORDER :) "<<"GENERATING BILL "<<endl;
  order.set_customer();
  order.show(cout);
  order.show(file);
}


works fine
Sun May 02 15:10:21 2021
John
Doe
1234 12
New york 12
10 * Lemon Pepper Wings 144
Total=1440

Last edited on
works fine


with issues.

1) There's no check that the file opened OK.

2) Array indexes start at 0, not 1

3) Use literal \n to output a newline, not endl (ie cout << "end\n";)

4) Variables should be initialised when defined

5) When just using stream extraction, there's no need to repeatedly use .ignore(). This removes a char from the input stream (expected to be \n but may not be depending upon the input)

6) There's no check that that the entered order number is valid

7) There's no check that the entered quantity is valid
I fixed some of the issues but I'm having a problem in the Ifstream of my file. I found this program for getting the last of the file but apparently when I take the var1 its first letter is missing.

The output file contains Saturday, 4-May-2021 on its last line

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
std::istream& ignoreline(std::ifstream& in, std::ifstream::pos_type& pos)
{
    pos = in.tellg();
    return in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

std::string getLastLine(std::ifstream& in)
{
    std::ifstream::pos_type pos = in.tellg();

    std::ifstream::pos_type lastPos;
    while (in >> std::ws && ignoreline(in, lastPos))
        pos = lastPos;

    in.clear();
    in.seekg(pos);

    std::string line;
    std::getline(in, line);
    return line;

void orderSystem::filechecker()
{
	string var1;
    string var2;
    string var3;
    string var4;
    ifstream file("Daily.txt");

    if (file)
    {
        std::string line = getLastLine(file);
        
     istringstream iss(line);
        getline(iss, var1, ',');
        
        getline(iss, var2, '-');
             
        getline(iss, var3, '-');
 
        getline(iss, var4, '-');  
    }
    else
        cout << "Error\n";
}
}
Last edited on
Why do you want the last line of the file? var1, var2, var3, var4 are not used after being set??

I want to use those date to classify the order based on their time so I can compare the last day in tm_mday to the last day in the file
Last edited on
Yes, but why read from the file? Why not just compare the date written? The Order class has time_of_order.
I need to overwrite the file if their day of order does not match it and append the orders if the day of the order in the file is the same
Last edited on
Try this to obtain the last file of a file:

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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

std::string getLastLine(std::ifstream& ifs)
{
	ifs.seekg(-1, std::ios::end);

	for (; ifs.peek() == '\n'; ifs.seekg(-1, std::ios::cur));
	for (; ifs.peek() != '\n'; ifs.seekg(-1, std::ios::cur));

	std::string last;

	std::getline(ifs >> std::ws, last);

	return last;
}

int main()
{
	std::ifstream ifs("text.txt");

	if (!ifs)
		return (std::cout << "Cannot open file\n"), 1;

	const auto last {getLastLine(ifs)};

	std::cout << last << '\n';
}


Last edited on
I received this error in line 30



[Error] cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Last edited on
L30 in my code above is a }

L30 in your code above also doesn't refer to std::ostream.

To what code are you referring?

PS What version of C++ are you compiling as? Try compiling as C++17 if you aren't already doing so.
Last edited on
I received this error in line 30
Replace auto on line 27 with std::string.
What compiler are you using? With what C++ standard are you compiling for? That usage of auto has been used since C++11.
That error appears in the C++ Shell with C++14. So using auto is obviously problematic...
Topic archived. No new replies allowed.