2012-03-21 6 views
0

Я полностью застрял. Это моя неполная программа. Программа застревает в файле.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 > 0 до CalculateLineStats(). Это приведет к тому, что at() выбрасывает исключение std::out_of_range, которое не будет зависеть от вызывающего и приведет к ненормальному завершению работы программы.

Изменить на:

lineCopy = ReadALine(fin, lineLength); 

Там нет причин для хранения lineLength в отдельной переменной.

0

Похож Youre пропускания пустой строки lineCopy вашей функции CalculateLineStats в качестве 2-го параметра, а затем вызвать .at(). Перед вызовом этой функции вы должны прочитать строку.

Смежные вопросы