[英]C++ Trouble reading and writing to text file using the fstream object
[英]C++ fstream reading and writing to file
我完全被困住了。 這是我不完整的程序。 程序卡在.at或確定元音行是否固定。 我需要一些建議來修復程序。 該程序應該執行的操作將使用包含以下行的文本文件:
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++;
}
}
}
您不是從ReadALine()
存儲返回值,而是將lineLength > 0
傳遞給CalculateLineStats()
。 這將導致at()
拋出std::out_of_range
異常,該異常不會被調用方捕獲,並會導致程序異常終止。
改成:
lineCopy = ReadALine(fin, lineLength);
沒有理由將lineLength
存儲在單獨的變量中。
好像您將空字符串lineCopy
傳遞給函數CalculateLineStats
作為第二個參數,然后調用.at()
。 在調用此函數之前,應先將其讀入其中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.