Finish all but printing

This commit is contained in:
Tyler Beckman 2024-10-07 02:08:54 -06:00
commit b2e3fbc645
Signed by: Ty
GPG key ID: 2813440C772555A4
17 changed files with 5047 additions and 0 deletions

43
.clang-format Normal file
View file

@ -0,0 +1,43 @@
# Tyler's personal code-style formatting file, make sure to use the class version before turning in
IndentWidth: 4
UseTab: Always
TabWidth: 4
InsertBraces: false
SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
# System headers from C (hardcoded, it isn't really possible to automatically detect them with regex)
- Regex: '<c(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)>'
Priority: 3
# System headers without extension.
- Regex: '<([A-Za-z0-9\Q/-_\E])+>'
Priority: 2
# Local headers with extension.
- Regex: '"([A-Za-z0-9\Q/-_\E])+\.h(pp)?"'
Priority: 1
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
IndentCaseLabels: true
IntegerLiteralSeparator:
Binary: 0
Decimal: 3
Hex: -1
DerivePointerAlignment: false
PointerAlignment: Right
QualifierAlignment: Left

43
.class-clang-format Normal file
View file

@ -0,0 +1,43 @@
# A clang-format config to follow CSCI200's style guide, use before turning in
IndentWidth: 2
UseTab: Never
TabWidth: 2
InsertBraces: true
SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
# System headers from C
- Regex: '<c(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)>'
Priority: 3
# System headers without extension.
- Regex: '<([A-Za-z0-9\Q/-_\E])+>'
Priority: 2
# Local headers with extension.
- Regex: '"([A-Za-z0-9\Q/-_\E])+\.h(pp)?"'
Priority: 1
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
IndentCaseLabels: true
IntegerLiteralSeparator:
Binary: -1
Decimal: -1
Hex: -1
DerivePointerAlignment: false
PointerAlignment: Left
QualifierAlignment: Left

14
.gitignore vendored Normal file
View file

@ -0,0 +1,14 @@
# Ignore extensionless files
*
!*.*
!*/
# Allow makefile
!Makefile
# Packed files
*.tar.gz
# Compiled files
*.o
*.out

13
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/${workspaceFolderBasename}",
"args": [],
"preLaunchTask": "make"
}
]
}

5
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
"clang-tidy.compilerArgsBefore": [
"-xc++"
]
}

12
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,12 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "make",
"type": "shell",
"command": "make"
}
]
}

56
InputProcessor.cpp Normal file
View file

@ -0,0 +1,56 @@
#include "InputProcessor.h"
#include <fstream>
#include <iostream>
#include <vector>
InputProcessor::InputProcessor() {
_fileIn = std::ifstream();
_allWords = std::vector<std::string>();
}
bool InputProcessor::openStream() {
std::string file;
std::cout << "What is the name of the file you would like to read? ";
std::cin >> file;
if (std::cin.fail()) {
std::cout << "Invalid file input";
return false;
}
_fileIn.open(file);
if (_fileIn.fail()) {
std::cout << "Unable to open file, does it exist?" << std::endl;
return false;
}
return true;
}
void InputProcessor::closeStream() { _fileIn.close(); }
void InputProcessor::read() {
std::string characterBuffer = "";
char currentChar;
while (_fileIn.get(currentChar)) {
switch (currentChar) {
case ' ':
case '\n':
_allWords.push_back(characterBuffer);
characterBuffer.clear();
break;
default:
characterBuffer += currentChar;
break;
}
}
// Flush the rest of the buffer if the file doesn't end with a space or
// newline
if (!characterBuffer.empty()) {
_allWords.push_back(characterBuffer);
}
}
std::vector<std::string> InputProcessor::getAllWords() { return _allWords; }

54
InputProcessor.h Normal file
View file

@ -0,0 +1,54 @@
#ifndef INPUTPROCESSOR_H
#define INPUTPROCESSOR_H
#include <fstream>
#include <string>
#include <vector>
class InputProcessor {
public:
/**
* @brief Constructs a new InputProcessor, initializing internal fields to
* defaults
*
*/
InputProcessor();
/**
* @brief Prompts the user for the file to open, and opens it as an ifstream
*
* @return true The stream was opened successfully
* @return false The stream was unable to be opened successfully
*/
bool openStream();
/**
* @brief Closes the open file stream
*
*/
void closeStream();
/**
* @brief Reads all words from the currently open stream, and stores them
* internally in a vector of all words
*
*/
void read();
/**
* @brief Returns all the words parsed by this InputProcessor
*
* @return std::vector<std::string> The vector containing all words
*/
std::vector<std::string> getAllWords();
private:
/**
* @brief The raw file input stream to read from
*
*/
std::ifstream _fileIn;
/**
* @brief The vector containing all parsed words from the input stream
*
*/
std::vector<std::string> _allWords;
};
#endif // INPUTPROCESSOR_H

20
LICENSE.md Normal file
View file

@ -0,0 +1,20 @@
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

85
Makefile Normal file
View file

@ -0,0 +1,85 @@
TARGET = A3
SRC_FILES = main.cpp InputProcessor.cpp OutputProcessor.cpp
# Tyler's custom makefile extensions for CSCI200 (anyone can use these if they want)
.DEFAULT_GOAL := all # Necessary so `make` doesn't run the "pack" target, as it is declared before "all"
.PHONY: pack clean-run c run fmt
## Adds only the necessary files for build into a .tar.gz file, named appropriately
ARCHIVED_FILES = Makefile $(SRC_FILES) $(SRC_FILES:.cpp=.h) $(SRC_FILES:.cpp=.hpp)
pack: fmtc
tar --ignore-failed-read -czvf $(TARGET).tar.gz $(shell echo $(ARCHIVED_FILES) | xargs ls -d 2>/dev/null)
## Runs the pack target and then attempts to build & run the program to make sure it functions correctly
pack-test: pack
$(eval TMP := $(shell mktemp -d))
tar -xvzf $(TARGET).tar.gz --directory $(TMP)
make -C $(TMP)
$(TMP)/$(TARGET)
rm -rf $(TMP)
## An extension of the clean command that is shorter to type and removes a potential .tar.gz file
c: clean
$(DEL) -f $(TARGET).tar.gz
## Simply builds and then executes the program
run: all
./$(TARGET)
## Formats all cpp, h, and hpp files with clang-format, using my personal clang-format config
fmt:
find . -iname '*.hpp' -o -iname '*.h' -o -iname '*.cpp' | xargs clang-format --style=file:.clang-format -i
## Formats all cpp, h, and hpp files with clang-format, using the class clang-format config
fmtc:
find . -iname '*.hpp' -o -iname '*.h' -o -iname '*.cpp' | xargs clang-format --style=file:.class-clang-format -i
## Modifies the SRC_FILES variable to have all .cpp files in the repo
setupsrc:
sed -i "0,/SRC_FILE.\{0\}S = .*/ s//SRC_FILES = $(shell find . -iname '*.cpp' -printf '%P\n')/" Makefile
## Alias to setup SRC_FILES and then dependencies
setup: setupsrc depend
# NO EDITS NEEDED BELOW THIS LINE
CXX = g++
CXXFLAGS = -O2
CXXFLAGS_DEBUG = -g
CXXFLAGS_WARN = -Wall -Wextra -Wunreachable-code -Wshadow -Wpedantic
CPPVERSION = -std=c++17
OBJECTS = $(SRC_FILES:.cpp=.o)
ifeq ($(shell echo "Windows"), "Windows")
TARGET := $(TARGET).exe
DEL = del
Q =
else
DEL = rm -f
Q = "
endif
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CXX) -o $@ $^
.cpp.o:
$(CXX) $(CXXFLAGS) $(CPPVERSION) $(CXXFLAGS_DEBUG) $(CXXFLAGS_WARN) -o $@ -c $<
clean:
$(DEL) -f $(TARGET) $(OBJECTS) Makefile.bak
depend:
@sed -i.bak '/^# DEPENDENCIES/,$$d' Makefile
@$(DEL) sed*
@echo $(Q)# DEPENDENCIES$(Q) >> Makefile
@$(CXX) -MM $(SRC_FILES) >> Makefile
.PHONY: all clean depend
# DEPENDENCIES
main.o: main.cpp InputProcessor.h OutputProcessor.h
InputProcessor.o: InputProcessor.cpp InputProcessor.h
OutputProcessor.o: OutputProcessor.cpp OutputProcessor.h

92
OutputProcessor.cpp Normal file
View file

@ -0,0 +1,92 @@
#include "OutputProcessor.h"
#include <fstream>
#include <iostream>
#include <vector>
OutputProcessor::OutputProcessor() {
_fileOut = std::ofstream();
_allWords = std::vector<std::string>();
_uniqueWords = std::vector<std::string>();
_letterCounts = std::vector<unsigned int>(26, 0);
_wordCounts = std::vector<unsigned int>();
_totalLetterCount = 0;
_totalWordCount = 0;
}
void OutputProcessor::analyzeWords(std::vector<std::string> allWords,
std::string punctuation) {
// Iterate over all words, processing incrementally
for (size_t wordIdx = 0; wordIdx < allWords.size(); wordIdx++) {
std::string& word = allWords.at(wordIdx);
// Remove punctuation from word
size_t punctuationIdx = 0;
while ((punctuationIdx = word.find_first_of(punctuation)) !=
std::string::npos) {
word.erase(punctuationIdx, 1);
}
// Save word internally
_allWords.push_back(word);
// Check all unique words for a match, and if so increment the count
bool foundUnique = false;
for (size_t uniqueWordIdx = 0; uniqueWordIdx < _uniqueWords.size();
uniqueWordIdx++) {
if (_uniqueWords.at(uniqueWordIdx) == word) {
_wordCounts.at(uniqueWordIdx)++;
foundUnique = true;
}
}
// If no unique word exists, add it to both vectors
if (!foundUnique) {
_uniqueWords.push_back(word);
_wordCounts.push_back(1);
}
// Add letter count for each letter in the word
for (size_t letterIdx = 0; letterIdx < word.length(); letterIdx++) {
char letter = word.at(letterIdx);
// Normalize to uppercase
if (letter >= 'a' && letter <= 'z') {
letter -= 32;
}
// Subtracting an uppercase letter by 65 creates its alphabetical
// index
letter -= 65;
_letterCounts.at(letter)++;
}
// Sum total letter count
_totalLetterCount += word.length();
// Increment total word count
_totalWordCount++;
}
}
bool OutputProcessor::openStream() {
std::string file;
std::cout << "What is the name of the file you would like to write to? ";
std::cin >> file;
if (std::cin.fail()) {
std::cout << "Invalid file input";
return false;
}
_fileOut.open(file);
if (_fileOut.fail()) {
std::cout << "Unable to open file, does it exist?" << std::endl;
return false;
}
return true;
}
void OutputProcessor::closeStream() { _fileOut.close(); }
void OutputProcessor::write() {
// TODO
}

89
OutputProcessor.h Normal file
View file

@ -0,0 +1,89 @@
#ifndef OUTPUTPROCESSOR_H
#define OUTPUTPROCESSOR_H
#include <fstream>
#include <string>
#include <vector>
class OutputProcessor {
public:
/**
* @brief Constructs a new OutputProcessor, setting internal fields to their
* initial state
*
*/
OutputProcessor();
/**
* @brief Removes punctuation from the list of allWords, stores this
* internally, and then computes the list of all unique words in the
* original vector. In addition, it will compute the amount of occurrences
* of all words in the text, and the amounts of letters in each word in the
* text.
*
* @param allWords The vector containing all read words from the text
* @param punctuation A string containing punctuation to remove from the
* original vector of words
*/
void analyzeWords(std::vector<std::string> allWords, std::string punctuation);
/**
* @brief Prompts the user for the filename of the file they wish to open
* for outputting to, and then opens an output stream to that file
*
* @return true The stream was opened successfully
* @return false The stream was unable to be opened successfully
*/
bool openStream();
/**
* @brief Closes the open output stream
*
*/
void closeStream();
/**
* @brief Nicely prints the computed data to the output stream as specified
*
*/
void write();
private:
/**
* @brief The output stream to write to
*
*/
std::ofstream _fileOut;
/**
* @brief The list of all words with punctuation removed
*
*/
std::vector<std::string> _allWords;
/**
* @brief The list of all unique words, parsed from the full set
*
*/
std::vector<std::string> _uniqueWords;
/**
* @brief A vector containing information on how often each letter occurs in
* the text. The index corresponds to the alphabetical value minus one (A is
* 0, B is 1, C is 2, etc)
*
*/
std::vector<unsigned int> _letterCounts;
/**
* @brief A vector containing information on how common each unique words is
* in the list of all words. The index for each word in _uniqueWords is the
* same as the index for the same word in this vector.
*
*/
std::vector<unsigned int> _wordCounts;
/**
* @brief The total amount of letters in the text
*
*/
unsigned int _totalLetterCount;
/**
* @brief The total amount of words in the text
*
*/
unsigned int _totalWordCount;
};
#endif // OUTPUTPROCESSOR_H

23
input/aliceChapter1.txt Normal file
View file

@ -0,0 +1,23 @@
Alice was beginning to get very tired of sitting by her sister on the
bank, and of having nothing to do: once or twice she had peeped into the
book her sister was reading, but it had no pictures or conversations in
it, "and what is the use of a book," thought Alice, "without pictures or
conversation?"
So she was considering in her own mind (as well as she could, for the
hot day made her feel very sleepy and stupid), whether the pleasure
of making a daisy-chain would be worth the trouble of getting up and
picking the daisies, when suddenly a White Rabbit with pink eyes ran
close by her.
There was nothing so VERY remarkable in that; nor did Alice think it so
VERY much out of the way to hear the Rabbit say to itself, "Oh dear!
Oh dear! I shall be late!" (when she thought it over afterwards, it
occurred to her that she ought to have wondered at this, but at the time
it all seemed quite natural); but when the Rabbit actually TOOK A WATCH
OUT OF ITS WAISTCOAT-POCKET, and looked at it, and then hurried on,
Alice started to her feet, for it flashed across her mind that she had
never before seen a rabbit with either a waistcoat-pocket, or a watch
to take out of it, and burning with curiosity, she ran across the field
after it, and fortunately was just in time to see it pop down a large
rabbit-hole under the hedge.

131
input/greeneggsandham.txt Normal file
View file

@ -0,0 +1,131 @@
I AM SAM. I AM SAM. SAM I AM.
THAT SAM I AM! THAT SAM I AM! I DO NOT LIKE THAT SAM I AM!
WOULD YOU LIKE GREEN EGGS AND HAM?
I DO NOT LIKE THEM, SAM I AM.
I DO NOT LIKE GREEN EGGS AND HAM.
WOULD YOU LIKE THEM HERE OR THERE?
I WOULD NOT LIKE THEM HERE OR THERE.
I WOULD NOT LIKE THEM ANYWHERE.
I DO NOT LIKE GREEN EGGS AND HAM.
I DO NOT LIKE THEM, SAM I AM.
WOULD YOU LIKE THEM IN A HOUSE?
WOULD YOU LIKE THEM WITH A MOUSE?
I DO NOT LIKE THEM IN A HOUSE.
I DO NOT LIKE THEM WITH A MOUSE.
I DO NOT LIKE THEM HERE OR THERE.
I DO NOT LIKE THEM ANYWHERE.
I DO NOT LIKE GREEN EGGS AND HAM.
I DO NOT LIKE THEM, SAM I AM.
WOULD YOU EAT THEM IN A BOX?
WOULD YOU EAT THEM WITH A FOX?
NOT IN A BOX. NOT WITH A FOX.
NOT IN A HOUSE. NOT WITH A MOUSE.
I WOULD NOT EAT THEM HERE OR THERE.
I WOULD NOT EAT THEM ANYWHERE.
I WOULD NOT EAT GREEN EGGS AND HAM.
I DO NOT LIKE THEM, SAM I AM.
WOULD YOU? COULD YOU? IN A CAR?
EAT THEM! EAT THEM! HERE THEY ARE.
I WOULD NOT, COULD NOT, IN A CAR.
YOU MAY LIKE THEM. YOU WILL SEE.
YOU MAY LIKE THEM IN A TREE!
I WOULD NOT, COULD NOT IN A TREE.
NOT IN A CAR! YOU LET ME BE.
I DO NOT LIKE THEM IN A BOX.
I DO NOT LIKE THEM WITH A FOX.
I DO NOT LIKE THEM IN A HOUSE.
I DO NOT LIKE THEM WITH A MOUSE.
I DO NOT LIKE THEM HERE OR THERE.
I DO NOT LIKE THEM ANYWHERE.
I DO NOT LIKE GREEN EGGS AND HAM.
I DO NOT LIKE THEM, SAM I AM.
A TRAIN! A TRAIN! A TRAIN! A TRAIN!
COULD YOU, WOULD YOU ON A TRAIN?
NOT ON TRAIN! NOT IN A TREE!
NOT IN A CAR! SAM! LET ME BE!
I WOULD NOT, COULD NOT, IN A BOX.
I WOULD NOT, COULD NOT, WITH A FOX.
I WILL NOT EAT THEM IN A HOUSE.
I WILL NOT EAT THEM HERE OR THERE.
I WILL NOT EAT THEM ANYWHERE.
I DO NOT EAT GREEN EGGS AND HAM.
I DO NOT LIKE THEM, SAM I AM.
SAY! IN THE DARK? HERE IN THE DARK!
WOULD YOU, COULD YOU, IN THE DARK?
I WOULD NOT, COULD NOT, IN THE DARK.
WOULD YOU COULD YOU IN THE RAIN?
I WOULD NOT, COULD NOT IN THE RAIN.
NOT IN THE DARK. NOT ON A TRAIN.
NOT IN A CAR. NOT IN A TREE.
I DO NOT LIKE THEM, SAM, YOU SEE.
NOT IN A HOUSE. NOT IN A BOX.
NOT WITH A MOUSE. NOT WITH A FOX.
I WILL NOT EAT THEM HERE OR THERE.
I DO NOT LIKE THEM ANYWHERE!
YOU DO NOT LIKE GREEN EGGS AND HAM?
I DO NOT LIKE THEM, SAM I AM.
COULD YOU, WOULD YOU, WITH A GOAT?
I WOULD NOT, COULD NOT WITH A GOAT!
WOULD YOU, COULD YOU, ON A BOAT?
I COULD NOT, WOULD NOT, ON A BOAT.
I WILL NOT, WILL NOT, WITH A GOAT.
I WILL NOT EAT THEM IN THE RAIN.
NOT IN THE DARK! NOT IN A TREE!
NOT IN A CAR! YOU LET ME BE!
I DO NOT LIKE THEM IN A BOX.
I DO NOT LIKE THEM WITH A FOX.
I WILL NOT EAT THEM IN A HOUSE.
I DO NOT LIKE THEM WITH A MOUSE.
I DO NOT LIKE THEM HERE OR THERE.
I DO NOT LIKE THEM ANYWHERE!
I DO NOT LIKE GREEN EGGS AND HAM!
I DO NOT LIKE THEM, SAM I AM.
YOU DO NOT LIKE THEM. SO YOU SAY.
TRY THEM! TRY THEM! AND YOU MAY.
TRY THEM AND YOU MAY, I SAY.
SAM! IF YOU LET ME BE,
I WILL TRY THEM. YOU WILL SEE.
SAY! I LIKE GREEN EGGS AND HAM!
I DO! I LIKE THEM, SAM I AM!
AND I WOULD EAT THEM IN A BOAT.
AND I WOULD EAT THEM WITH A GOAT...
AND I WILL EAT THEM, IN THE RAIN.
AND IN THE DARK. AND ON A TRAIN.
AND IN A CAR. AND IN A TREE.
THEY ARE SO GOOD, SO GOOD, YOU SEE!
SO I WILL EAT THEM IN A BOX.
AND I WILL EAT THEM WITH A FOX.
AND I WILL EAT THEM IN A HOUSE.
AND I WILL EAT THEM WITH A MOUSE.
AND I WILL EAT THEM HERE AND THERE.
SAY! I WILL EAT THEM ANYWHERE!
I DO SO LIKE GREEN EGGS AND HAM!
THANK YOU! THANK YOU, SAM I AM.

4
input/happybirthday.txt Normal file
View file

@ -0,0 +1,4 @@
Happy birthday to you,
Happy birthday to you,
Happy birthday to Bjourne,
Happy birthday to you!

4316
input/romeoandjuliet.txt Normal file

File diff suppressed because it is too large Load diff

47
main.cpp Normal file
View file

@ -0,0 +1,47 @@
#include "InputProcessor.h" // our custom InputProcessor class
#include "OutputProcessor.h" // our custom OutputProcessor class
#include <iostream> // for cout, endl
#include <string> // for string
#include <vector> // for vector
using namespace std; // so we don't have to type std:: every time
int main() {
// create an input processor object
InputProcessor iProcessor;
// open a stream to input from
if (!iProcessor.openStream()) {
// if stream failed to open, quit the program
cerr << "Shutting down..." << endl;
return -1;
}
// read the data on the stream
iProcessor.read();
// close the input stream
iProcessor.closeStream();
// retrieve all the words read from the stream
std::vector<std::string> inputWords = iProcessor.getAllWords();
// create an output processor object
OutputProcessor oProcessor;
// analyze the words and ignore the specified punctuation
oProcessor.analyzeWords(inputWords, "?!.,;:\"()_-'&[]");
// open a stream to output to
if (!oProcessor.openStream()) {
// if stream failed to open, quit the program
cerr << "Shutting down..." << endl;
return -2;
}
// write the data to the stream
oProcessor.write();
// close the output stream
oProcessor.closeStream();
// signal to user program has completed
cout << "Analysis complete, check file for results" << endl;
// end our program!
return 0;
}