Search code examples
c++text-filesfstreamgetline

Unable to read a text file in c++


Hi my college class was given a group assignment to read a multi-line text file, drop the lowest score, then average the score from the remaining numbers. I've run into a problem when prompted for the filename of the text file. Although I type it in correctly, it won't load. I have the file in the same folder that the program is located. Please help:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const int NROWS =10;
const int NCOLS =10;

void theProgram();
//Function loads immediately upon opening the program and describes the purpose of the program
//and its functionality.

int ReadTxtFile(ifstream &file, string name[], double test[][NCOLS], int ncolUsed=3);
//Function reads data from a tab delimited file, whose first column is a string and the others are 
//double or int. The function returns the number of rows read. The requires three parameters to be 
//passed to it. The fourth parameter is has a default value of 3.

void outPutData(string header, string name[], double test[][NCOLS], int nDataPts, int ncolUsed=3);
//The function prints out the data read from the file. The function requires four parameters to be 
//passed to it. Does not return any value.

int main(){

   string name[NROWS];
   string header, filename;
   double test[NROWS][NCOLS];
   char next;
   int nDataRows;
   ifstream file; //Declares file as an input file stream 

   theProgram(); //Invokes the function that displays the program information

   cout<<"Please give me the filenames containing the test scores\n";
   getline(cin,filename);

//Opens the file and checks if the file has opened correctly
   file.open(filename);
   if(file.fail()){
     cout<<"Failed to open input file "<<filename<<endl;
     exit(1);
   }

   getline(file,header);// Reads the column headers as a string
   nDataRows=ReadTxtFile(file, name, test); // Calls the function to read the file
   file.close();

   cout<< "Number of records in the file is "<<nDataRows<<endl;  
   outPutData(header,name, test, nDataRows); //Calls the function to output the data read from the file


   cin>>next;
} //End of main


void theProgram(){
    cout<<"************************************************************************\n";
    cout<<"* ******************************************************************** *\n";
    cout<<"* *This program will help the faculty to analyze the test scores and * *\n";
    cout<<"* *assign grades. It reads a tab delimited file that contains the    * *\n"; 
    cout<<"* *raw score for different tests and drops the lowest score. It then * *\n";
    cout<<"* *calcluates the average percentage of the remaining test scores.   * *\n";
    cout<<"* *Based on the average, the program then assigns a letter grade.    * *\n";
    cout<<"* ******************************************************************** *\n";
    cout<<"************************************************************************\n";
}

void outPutData( string header, string name[], double test[][NCOLS], int nDataRows, int ncolUsed)
{
   cout<<"\t"<<header<<endl;
   for(int i=0; i<nDataRows; i++){
       cout<<i<<"\t"<<name[i]<<"\t";
       for(int j=0; j<ncolUsed; j++){
           cout<<test[i][j]<<"\t";
       }
       cout<<endl;
    }
char next; 
cin>>next;
} 


int ReadTxtFile(ifstream &file, string name[], double test[][NCOLS], int ncolUsed)
{
    int i=0;
    char next;
    while (!file.eof()) //repeat until end of file
    {
        file>>name[i];
        for(int j=0; j<ncolUsed; j++){
            file>>test[i][j];
        }
        file.get(next);
        if(!file.eof()){
            file.putback(next);
        }
        i++;
    }
    return(i-1);
}

Solution

  • Before C++11, file.open() accepts a char*, which is C-string containing the name of the file to be opened , however, filename is of string type, you need to do the following:

     file.open(filename.c_str());
    

    in order to read from the file.

    EDIT: thanks to Benjamin Lindley, you can pass string to open() in C++11. You may need to check the exe file generated from your code can access your file, they may not be in same directory.