Thought I'd post this here for future reference in case anyone is searching.
Along with the help of a programmer on my Linux mailing list, here is a pretty simple answer to what I was trying to do.
Write only as many items to the file as you have in your array.
When you reading the items back from file you can count them until you reaching the end of file. With this value you can set the num_items variable.
**Working Code**
Code:
#include <iostream>
#include <fstream>
using namespace std;
struct StockItem
{
int code;
char desc[20];
float price;
}stock[125];
/*struct bill_line
{
StockItem product;
float weight;
float cost;
};
struct bill
{
bill_line items[20];
int num_lines;
};*/
void writeToDisk( StockItem*, int );
int readFromDisk( StockItem* );
void disp_menu(void);
struct StockItem enter_data();
void see_stock(StockItem stock[125], int num_items);
int main()
{
int ans, ctr;
int num_items = 0;
do
{
do
{
disp_menu();
cin >> ans;
} while ((ans<1) || (ans>6));
switch (ans)
{
case 1:
stock[num_items] = enter_data();
num_items++;
break;
case 2:
see_stock(stock, num_items);
break;
case 3:
writeToDisk( stock, num_items );
// ^^^^^^^^^ <-- writing NOT the whole array
// to disk.
break;
case 4:
num_items = readFromDisk( stock );
// ^^^^^^^^^ <---- setting the number items we read from file
break;
default:
break;
}
}while (ans!=5);
return 0;
}
void writeToDisk( StockItem* array, int numOfItems )
{
ofstream outfile( "items.txt" );
for( int index = 0; index < numOfItems; index++ )
outfile.write( (char*)&array[index], sizeof(StockItem) );
}
int readFromDisk( StockItem* array )
{
int numOfItems = 0;
ifstream infile( "items.txt" );
StockItem tmp_stockItem;
// read from the file until we are reaching the eof
while( infile.read( (char*)&tmp_stockItem, sizeof(tmp_stockItem) ) )
{
// after a successfull read we storing the the item into the array
memcpy( &array[numOfItems],
&tmp_stockItem,
sizeof( array[numOfItems] ) );
numOfItems++;
}
// returning the number of array items we read from the file
return numOfItems;
}
void disp_menu()
{
cout << "\n*** The Corner Shop ***\n\n";
cout << "Select an option: \n\n";
cout << "\t1. Enter new stock " << endl;
cout << "\t2. See current stock " << endl;
cout << "\t3. Save stock to disk " << endl;
cout << "\t4. Load stock from disk " << endl;
cout << "\t5. Exit \n" << endl;
cout << "option> ";
}
StockItem enter_data()
{
StockItem stock_item;
cout << "\n\nWhat is the product code: ";
cin >> stock_item.code;
cout << "What is the product description: ";
cin.ignore();
cin.getline(stock_item.desc, 20);
cout << "What is the product price: ";
cin >> stock_item.price;
return (stock_item);
}
void see_stock(StockItem stock[125], int num_items)
{
int ctr;
char ret;
cout << "\n\nHere is the stock listing:\n\n";
for (ctr = 0; ctr < num_items; ++ctr)
{
cout << "Item " << ctr+1 << endl;
cout << "Product Code: " << stock[ctr].code << endl;
cout << "Product Description: " << stock[ctr].desc << endl;
cout << "Price: " << stock[ctr].price << endl;
cout << "------------------------------------------------\n";
}
}