C++ abstract file filter reads an input file transforms it in some way and writes the results to an output file
File Filter
A file filter reads an input file, transforms it in some way, and writes the results to an output
file. Write an abstract file filter class that defines a pure virtual function for transforming
a character. Create one derived class of your file filter class that performs encryption,
another that transforms a file to all uppercase, and another that creates an unchanged
copy of the original file. The class should have the following member function:
void doFilter(ifstream &in, of stream &out)
This function should be called to perform the actual filtering. The member funct ion
for transforming a single character should have the prototype:
char transform(char ch)
The encryption class should have a constructor that takes an integer as an argument
and uses it as the encryption key.
Answer:
// File Filter #include <iostream> #include <fstream> #include <cctype> using namespace std; //*********************************************** // Filter class declaration * //*********************************************** class Filter { public: void doFilter(fstream &in, fstream &out); protected: virtual char transform(char ch) = 0; }; //********************************************** // The doFilter method performs the filtering. * // ********************************************* void Filter::doFilter(fstream &in, fstream &out) { char ch = in.get(); while (ch != EOF) { out.put(transform(ch)); ch = in.get(); } } //********************************************* // Uppercase Class Declaration. This class is * // derived from the Filter class. * //********************************************* class UpperCaseFilter: public Filter { protected: char transform(char ch) { return toupper(ch); } }; void printFile(fstream &); // Prototype const int SIZE = 81; // Array size for file name //*********************************************** // The main function * //*********************************************** int main( ) { char inFileName[SIZE]; // To hold the input file name char outFileName[SIZE]; // To hold the output file name // Explain the program cout << "This program creates an uppercase " << "version of a test file.\n"; cout << "Enter name of input file (input.txt): "; cin >> inFileName; fstream inputFile(inFileName, ios::in); if (!inputFile) { cout << "The file " << inFileName << " cannot be opened." << endl; exit(EXIT_FAILURE); } // Echo the input file cout << "\nOriginal file is: " << endl; printFile(inputFile); cout << endl; cout << "Enter name of output file: "; cin >> outFileName; fstream outputFile(outFileName, ios::out); if (!outputFile) { cout << "The file " << outFileName << " cannot be opened." << endl; exit(EXIT_FAILURE); } // Process UpperCaseFilter upperFilter; upperFilter.doFilter(inputFile, outputFile); // Close output file and reopen for reading so we can print // its contents. outputFile.close(); outputFile.open(outFileName, ios::in); cout << "\nFiltered file is: " << endl; printFile(outputFile); // Close all files inputFile.close(); outputFile.close(); return 0; } // ************************************** // Print file function * // ************************************** void printFile(fstream &file) { // Start at beginning of file file.clear(); file.seekg(0, ios::beg); // Print the file contents char ch = file.get(); while (ch != EOF) { cout << ch; ch = file.get(); } // Go back to beginning of file for further processing. file.clear(); file.seekg(0, ios::beg); }
Leave a reply