1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

File I/O (Reading from a Random-Access File)

Discussion in 'C' started by VersEtreOuNe, Feb 12, 2008.

  1. VersEtreOuNe

    VersEtreOuNe New Member

    Joined:
    Feb 12, 2008
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    INFO:
    The program should enter a circle radius and Id for that circle to a file, then it should search for that id and print the radius for that circle.

    PROBLEM:
    This program compiles but it's not searching properly.

    Circle.h
    Code:
    #ifndef CIRCLE_H
    #define CIRCLE_H
    
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    class Circle
    {
    	friend ostream& operator <<(ostream& output, const Circle& aCircle);
    	friend istream& operator >>(istream& input, Circle& aCircle);
    
    public:
    	Circle();
    	Circle(double radius, int id);
    	Circle(const Circle& aCircle);
    
    	void SetCircleRadius(double radius) { _circleRadius = radius; }
    	void SetCircleId(int id)   { _circleId = id; }
    
    	double GetCircleRadius() const   { return _circleRadius; }
    	int GetCircleId() const { return _circleId; }
    
    private:
    	double  _circleRadius;
    	int     _circleId;
    };
    
    #endif
    
    
    Circle.cpp
    Code:
    #include "Circle.h"
    
    Circle::Circle()
    {
    	_circleId = 0;
    	_circleRadius = 0.0;
    }
    
    Circle::Circle(double radius, int id)
    {
    	_circleId = id;
    	_circleRadius = radius;
    }
    
    Circle::Circle(const Circle& aCircle)
    {
    	_circleId = aCircle._circleId;
    	_circleRadius = aCircle._circleRadius;
    }
    
    ostream& operator <<(ostream& output, const Circle& aCircle)
    {
    	output << "\n          ------------" << endl;
    	output << "          Id    radius" << endl;
    	output << "          ------------" << endl;
    	output << "          " << aCircle._circleId << "     " << aCircle._circleRadius << endl;
    	output << "          ------------" << "\n\n";
    
    	return (output);
    }
    
    istream& operator >>(istream& input, Circle& aCircle)
    {
    	int quantity;
    	cout << "\nHow many circles do you want to add ";
    	input >> quantity;
    
    	for (int i = 0; i < quantity; ++i)
    	{
    		cout << "\n\nEnter the ID of Circle #" << (i + 1) << " : ";
    		input >> aCircle._circleId;
    
    		cout << "Enter Radius of Circle #" << (i + 1) << " : ";
    		input >> aCircle._circleRadius;
    
    		cout << endl;
    	}
    
    	return (input);
    }
    
    
    main.cpp
    Code:
    #include <iostream>
    #include <conio.h>
    #include <fstream>
    using namespace std;
    
    #include "Circle.h"
    
    int main ()
    {
    	Circle aCircle;
    	fstream file;
    	int option;
    
    	do
    	{
    		cout << "Menu \n"
    			 << " (1) Add Circle(s) \n"
    			 << " (2) Find a Circle by ID \n"
    			 << " (3) Exit \n"
    			 << "Your Selection -> ";
    		cin >> option;
    
    		switch (option)
    		{
    		case 1:
    			file.close();
    			file.clear();
    
    			file.open("Circle.dat", ios::out | ios::app | ios::binary);
    			
    			if (!file)
    			{
    				cerr << "\n\nFailed to open file.\n\n";
    				system("PAUSE");
    				exit(1);
    			}
    			else
    			{
    				cin >> aCircle;
    				file.write(reinterpret_cast<char*> (&aCircle), sizeof(Circle));
    			}
    			break;
    
    		case 2:
    			file.close();
    			file.clear();
    
    
    			cout << "Enter id: ";
    			int id;
    			cin >> id;
    			aCircle.SetCircleId(id);
    
    			file.open("Circle.dat", ios::in | ios::app | ios::binary);
    
    			if (!file)
    			{
    				cerr << "\n\nFailed to open file.\n\n";
    				system("PAUSE");
    				exit(1);
    			}
    			else
    			{
    				file.seekg(id * sizeof(Circle), ios::beg);
    				file.read(reinterpret_cast<char *> (&aCircle), sizeof(Circle));
    
    				cout << aCircle;
    			}	
    			break;
    
    
    		case 3:
    			file.close();
    			cout << "\n\nG   o    o    D    B    y    E\n\n";
    			exit(0);
    			break;
    
    
    		default:
    			cerr << "\nERROR: Wrong Option menu. Please try again.\n\n";
    
    		}
    
    	} while (option != 3);
    
    	return EXIT_SUCCESS;
    }
    
    
     

Share This Page