2012-03-21 223 views
0

我完全卡住了。這是我的不完整的程序。該程序卡在the.at或如果確定是否元音線。我需要一些建議來修復我的程序。什麼程序是應該做的服用含這些行的文本文件:C++ fstream讀取和寫入文件

 
C++ Programming is fun 
Winter is here, will it ever end? 
The style requirements document is so useful 
Functions really make programming easier 
Spring must be coming soon... 
I wish this #$##$$!!## program was done 
What comes after C++, D--? 

我應該做一些計算和導出到文件中,所以它看起來就像這個鏈接:http://tinypic.com/r/24fhbfb/5

這裏我的代碼到目前爲止。任何指針,我做錯了將不勝感激。我必須在功能上做所有​​事情。

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 

using namespace std; 

void OpenFiles (ifstream& inFile, ofstream& outFile); 

void OutputDivider (ofstream& outFile, char symbol, int num); 

void SetFileMessage (ifstream& inFile, bool& fileFound, string& message); 

void OutputFileMessage (bool& fileFound, ofstream& outFile, string& message); 

void InitializeFileCounters (int& lineCounter, int& totalOfAs, int& characterTotal); 

void OutputHeading (ofstream& outFile, string information, string name, int width); 

string ReadALine (ifstream& inFile, int& lineLength); 

void InitializeLineCounters (int& vowelCounter, int& charactersOfA, int& blankCounter); 

void CalculateLineStats (ifstream& inFile, string readLine, int& vowelCounter, int& lineLength, 
         int& blankCounter, int& charactersOfA); 



//Header to display in output file 
const string INFORMATION = "CST 133 - Exercise 4"; 
const string MY_NAME = "Tom Hangler"; 

//Width of screen for dividers 
const int SCREEN_WIDTH = 110; 

int main(void) 
{ 
    ifstream fin; 
    ofstream fout; 

    bool fileFound; 

    string message; 
    string lineCopy; 

    int lineCounter; 
    int totalOfAs; 
    int characterTotal; 
    int vowelCounter; 
    int charactersOfA; 
    int blankCounter; 
    int lineLength; 

    //Open input and output text files 
    OpenFiles(fin, fout); 

    //Set message based on if file was found or not 
    SetFileMessage(fin, fileFound, message); 

    //Output message to text file if file was not found 
    OutputFileMessage(fileFound, fout, message); 

    if (fileFound) 
    { 
     InitializeFileCounters(lineCounter, totalOfAs, characterTotal); 

     OutputHeading(fout, INFORMATION, MY_NAME, SCREEN_WIDTH); 

     InitializeLineCounters(vowelCounter, charactersOfA, blankCounter); 

     ReadALine(fin, lineLength); 

     CalculateLineStats(fin, lineCopy, vowelCounter, lineLength, blankCounter, charactersOfA); 

     ReadALine(fin, lineLength); 

    } 

    return 0; 
} 

void OpenFiles (ifstream& inFile, ofstream& outFile) 
{ 
    inFile.open("LinesEx4.txt"); 
    outFile.open("Ex4Out.txt"); 
} 

void OutputDivider (ofstream& outFile, char symbol, int num) 
{ 
    //Ouput to text file a divider with symbol '-' and specified length in 'num' 
    outFile << setfill(symbol) << setw(num) << symbol << endl; 
} 

void SetFileMessage (ifstream& inFile, bool& fileFound, string& message) 
{ 
    if (!inFile) 
    { 
     //Set message string to file not found. 
     message = "Input file was not found."; 

     //Set the file found flag 
     fileFound = false; 
    } 
    else 
    { 
     //Set the file found flag 
     fileFound = true; 

     //Set message string to file not found. 
     message = "Processing continues, file successfully opened."; 
    } 
} 

void OutputFileMessage (bool& fileFound, ofstream& outFile, string& message) 
{ 
    if (fileFound == false) 
    { 
     //Output divider to text file 
     OutputDivider(outFile, '-', SCREEN_WIDTH); 

     //Output message to text file. 
     outFile << message << endl; 

     //Output divider to text file 
     OutputDivider(outFile, '-', SCREEN_WIDTH); 
    } 
    else 
    { 
     //Output divider to text file 
     OutputDivider(outFile, '-', SCREEN_WIDTH); 

     //Output message to text file. 
     outFile << message << endl; 

     //Output divider to text file 
     OutputDivider(outFile, '-', SCREEN_WIDTH); 
    } 
} 

void InitializeFileCounters (int& lineCounter, int& totalOfAs, int& characterTotal) 
{ 
    //Initialize variables for total counting 
    lineCounter = 0; 
    totalOfAs = 0; 
    characterTotal = 0; 
} 

void OutputHeading (ofstream& outFile, string information, string name, int width) 
{ 
    outFile << '\n' << endl; 

    OutputDivider(outFile, '*', width); 

    outFile << setfill(' ') << setw((width + information.length())/2) << information << endl; 

    outFile << setfill(' ') << setw((width + name.length())/2) << name << endl; 

    outFile << "Line" << setw(50) << "Length" << setw(15) << "# of Vowels" << 
    setw(15) << "# of As" << setw(15) << "# of Blanks" << endl; 

    OutputDivider(outFile, '*', width); 
    } 

string ReadALine (ifstream& inFile, int& lineLength) 
{ 
    string readLine; 

    getline(inFile, readLine); 
    lineLength = readLine.length(); 

    return readLine; 
} 

void InitializeLineCounters (int& vowelCounter, int& charactersOfA, int& blankCounter) 
{ 
    //Initialize variables for line analysis 
    vowelCounter = 0; 
    charactersOfA = 0; 
    blankCounter = 0; 
} 

void CalculateLineStats (ifstream& inFile, string readLine, int& vowelCounter, int& lineLength, 
           int& blankCounter, int& charactersOfA) 
{ 
    int index; 

    for (index = 0; index < lineLength; index++) 
    { 
     if (readLine.at(index) == 'A' || readLine.at(index) == 'E' || readLine.at(index) == 'I' 
        || readLine.at(index) == 'O' || readLine.at(index) == 'U') 
     { 
      vowelCounter++; 
     } 
     if (readLine.at(index) == ' ') 
     { 
      blankCounter++; 
     } 
     if (readLine.at(index) == 'A') 
     { 
      charactersOfA++; 
     } 
    } 

}

回答

1

您不存儲從ReadALine()返回的值,但通過lineLength > 0CalculateLineStats()。這將導致at()拋出一個std::out_of_range異常,這個異常不會被調用者捕獲,並且會導致程序異常終止。

更改爲:

lineCopy = ReadALine(fin, lineLength); 

沒有理由對lineLength存儲在一個單獨的變量。

0

它看起來像您選擇傳遞一個空字符串lineCopy你的函數CalculateLineStats作爲第二個參數,然後調用.at()。在調用這個函數之前,你應該把它讀入它。