External files and streams

April 30, 2009 at 17:12:05
Specs: Windows XP
I am having a problem connecting my external file with a stream...I have only one error for the entire program. But just to give the background of it I am to extract data froma .txt file into the program and then input the data into an array of structs called data[]. within the struct there are three members called id, scores, and grade. Im having problems though because when it does execute it only shows 0s instead of the student id and scores in the file. below is my code and the data in the file scores.txt

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>

using namespace std;

struct studentInfo
{
int id;
int score;
char grade;
};
const int MAX_NUM = 50;
studentInfo data[MAX_NUM];
bool successful = false;
bool readStuData(ifstream, bool&, studentInfo data[]);
float getAverage(studentInfo data[], float& mean);
void assignGrades(studentInfo data[], float);
void reportResults(studentInfo data[]);

int _tmain(int argc, _TCHAR* argv[], float average)
{
ifstream inData("C:\\\\Documents and Settings\\Floyd\\My Documents\\scores.txt", ios::in);
readStuData(inData, successful, data);
getAverage(data, average);
cout<<"Student "<<data[0].id<<"test score is "<<data[0].score<<endl;
assignGrades(data, average);
reportResults(data);
return 0;
}

bool readStuData(ifstream inData, bool& successful, studentInfo data[])
{

int number;

if(inData.fail())
{
cerr << "***ERROR: Cannot open" << inData << endl;
successful = false;
return successful;
return EXIT_FAILURE;
}
else
{
successful = true;
return successful;
inData >> data[0].id >> data[0].score;
number = 0;
while (!inData.eof())
{
if (number=0, number<MAX_NUM, number++)
{
inData >> data[number].id >> data[number].score;
number++;
}
}
}
inData.close();
return successful;
}
float getAverage(studentInfo data[], float& mean)
{
float sum = 0.0;
int i;

for (i=0; i<MAX_NUM; i++)
{
sum = data[i].score + sum;
}
mean = sum / MAX_NUM;

return (mean);
}
void assignGrades(studentInfo data[], float average)
{
int i;
for (i=0; i<MAX_NUM; i++)
{
if ((data[i].score <= average + 10) || (data[i].score >= average - 10))
{
data[i].grade = 'S';
}
if (data[i].score > average + 10)
{
data[i].grade = 'O';
}
if (data[i].score < average - 10)
{
data[i].grade = 'U';
}
}
}
void reportResults(studentInfo data[])
{
ofstream out("C:\\\\Documents and Settings\\Floyd\\My Documents\\report.txt");
out << "TABLE OF STUDENT SCORES"<< setw(4) <<"Student ID #"<< setw(10)<<"Score"<< setw(14)<<"Grade"<< endl;
for (int i=0;i<MAX_NUM; i++)
out << setw(8) << data[i].id << setw(14)<< data[i].score << setw(14)<< data[i].grade << endl;
}

scores.txt

123 90
242 70
376 97
485 58
511 95
623 87
798 75
856 79
921 85
955 64


See More: External files and streams

Report •


#1
April 30, 2009 at 20:54:52
else
{
  successful = true;
  return successful;
  inData >> data[0].id >> data[0].score;
  number = 0;
  while (!inData.eof())
Well there's your problem. You're returning from your function before you read anything.

Report •

#2
May 1, 2009 at 12:04:28
Well I removed the reuten to the end of the function and still I am getting the same error:

c:\program files\microsoft visual studio 9.0\vc\include\fstream(676) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 9.0\vc\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
Build log was saved at "file://c:\Documents and Settings\Floyd\My Documents\Visual Studio 2008\Projects\passfailexcred\passfailexcred\Debug\BuildLog.htm"
passfailexcred - 1 error(s), 0 warning(s)


Report •

#3
May 1, 2009 at 14:47:14
bool readStuData(ifstream, bool&, studentInfo data[]);
The copy constructor is private. Presumably to prevent exactly what you're doing here. The solution is to use a reference:
bool readStuData(ifstream&, bool&, studentInfo data[]);


Report •

Related Solutions

#4
May 1, 2009 at 19:45:34
Thank you sooo much!!!!!!! Funny how that one simple problem caused like two weeks of troubleshooting! lol

Report •


Ask Question