- #1
ActionPotential
- 60
- 4
I am currently working on a C++ program for school. I am actually not finding too much difficulty in constructing the functions, enum-types, arrays and structs, however, I am finding great difficulty in using on ifstream variable to open multiple files.
I have posted the entire code that I have so far (even though I have pinpointed the issue to not properly opening the second file in ifstream).
I spent a couple of hours getting rid of certain functions/procedures, loops and variables and I get the same output (if what I removed doesn't crash it). I also get the same output whether I "open" the second file or not (meaning I removed all of the code for it and got the same output).
Here is the code (it's not finished because I am stuck on this file issue but hopefully my comments give you a clear enough picture to help). It's a bit messy since I am now in debug mode versus program mode:
I'll continue working on it and thank you for your time and assistance.
Regards,
ActionPotential
I have posted the entire code that I have so far (even though I have pinpointed the issue to not properly opening the second file in ifstream).
I spent a couple of hours getting rid of certain functions/procedures, loops and variables and I get the same output (if what I removed doesn't crash it). I also get the same output whether I "open" the second file or not (meaning I removed all of the code for it and got the same output).
Here is the code (it's not finished because I am stuck on this file issue but hopefully my comments give you a clear enough picture to help). It's a bit messy since I am now in debug mode versus program mode:
Code:
/* Trevor Novak - April 9, 2014 - "Bodylastics"
This program will construct an array of structs to determine
the resistance of corresponding resistance bands. It will also
calculate an individuals weight and provide an appropriate band. */
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
const string SENTINEL = "stop";
enum bandType {YELLOW, GREEN, RED, BLUE, BLACK};
struct bandRecord
{
string bandcolor;
int weight;
bool is_used;
};
/* Function Prototypes */
void setup(ifstream&, bandRecord[]);
void getBands(ifstream&, bandRecord[]);
bandType str_to_color(const string&);
void printBands(ofstream&, const bandRecord[]);
int totalResistance(const bandRecord[]);
void resetBands(bandRecord[]);
void weight_to_bands(int, bandRecord[]);
int main()
{
bandRecord myList[BLACK+1];
ifstream inData;
ofstream outData;
string bandcolor;
inData.open("setupData.txt"); // Open setupData File
if (not inData){
cout << "Can't open data.txt" << endl;
system ("pause");
return 1;}
outData.open("outData.txt"); // Generate outData File
if (not outData){
cout << "Can't open output.txt" << endl;
system ("pause");
return 1;}
setup(inData, myList); // Calls the setup procedure.
/* The follow lines are tests to find the code errors */
cout << myList[1].bandcolor << " " << myList[1].weight << endl;
cout << myList[4].bandcolor << " " << myList[4].weight << endl;
inData.close();
[b]/* -- THIS IS THE PROBLEM BELOW - I NEED DATA
FROM THIS FILE AND IT IS NOT OPENING */
inData.open("bandData.txt"); // Open bandData File
if (not inData){
cout << "Can't open data.txt" << endl;
system ("pause");
return 1;}[/b]
getBands(inData, myList); // Call getBands procedure.
/* The follow lines are tests to find the code errors */
cout << myList[2].is_used << " " << myList[2].bandcolor << endl;
cout << myList[1].is_used << " " << myList[1].bandcolor << endl;
cout << myList[4].is_used << " " << myList[4].bandcolor << endl;
printBands(outData, myList); // Call printBands procedure.
system("pause");
return 0;
}
/* Function/Procedure Definitions */
/* This procedure will read in data from a text file
into a struct called bandRecord and constructs an
array of type bandRecord. The array is indexed
by the enum type, bandType. */
void setup(ifstream& inData, bandRecord myList[])
{
for(int i=YELLOW; i <= BLACK; i++)
{
inData >> myList[i].bandcolor >> myList[i].weight;
myList[i].is_used = false;
}
}
/* This procedure will read in band colors as tempString.
It will then call by value str_to_color(tempString)
to assign its (enum type) value to a bandType tempBand.
It will then set the .is_used flag to true according
to index of the temporary bandType. */
void getBands(ifstream& inData, bandRecord myList[])
{
string tempString;
bandType tempBand;
inData >> tempString;
while(inData)
{
tempBand = str_to_color(tempString);
myList[tempBand].is_used = true;
}
}
/* This function will create a temporary character array
based on the contents of tempString. The switch will then
determine the first letter of the string and assign tempBand
the value of the corresponding enum-type. To resolve the issue
of black and blue, upon encountering 'b' it will test the third
letter to determine if it is "blAck" or "blUe". */
bandType str_to_color(const string& tempString)
{
bandType tempBand;
switch(tempString[0])
{
case 'y': tempBand = YELLOW;
break;
case 'g': tempBand = GREEN;
break;
case 'r': tempBand = RED;
break;
case 'b':
if(tempString[2] == 'u')
tempBand = BLUE;
if(tempString[2] == 'a')
tempBand = BLACK;
break;
return tempBand;
}
}
void printBands(ofstream& outData, const bandRecord myList[])
{
for(int i=YELLOW; i <= BLACK; i++)
{
if(myList[i].is_used == true)
{
outData << myList[i].bandcolor << myList[i].weight << endl;
}
}
}
int totalResistance(const bandRecord[])
{
}
void resetBands(bandRecord[])
{
}
void weight_to_bands(int, bandRecord[])
{
}
I'll continue working on it and thank you for your time and assistance.
Regards,
ActionPotential
Last edited: