无法在c ++中读取文本文件

时间:2013-04-10 00:19:36

标签: c++ text-files fstream getline

您好我的大学课程被分组阅读多行文本文件,删除最低分,然后从剩余数​​字中平均得分。当提示输入文本文件名时,我遇到了问题。虽然我输入正确,但不会加载。我将该文件放在程序所在的同一文件夹中。请帮忙:

#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);
}

1 个答案:

答案 0 :(得分:2)

在C ++ 11之前,file.open()接受char*,它是包含要打开的文件名的C字符串,但是filename属于string } type,您需要执行以下操作:

 file.open(filename.c_str());

以便从文件中读取。

编辑:感谢Benjamin Lindley,你可以在C ++ 11中将字符串传递给open()。您可能需要检查从您的代码生成的exe文件可以访问您的文件,它们可能不在同一目录中。