CS 3377 Project
FileReader.cpp //
#include <fcntl.h> #include <cerrno> #include <unistd.h> #include <cstring> #include "FileReader.h" #include "FileModifyException.h" #include "Util.h"
using namespace std;
char nameFirst[50] = "A Programming Guide to Linux Commands, Editors, a"; char nameSecond[50] = "Advanced Programming in the UNIX Environment by S";
string FileReader::getErrnoString() { return strerror(errno);
}
void FileReader::verifyNumBytes(ssize_t expected, ssize_t actual) { if ( expected != actual) {
throw FileModifyException("Bytes read/written (" + to_string(expected) + ") don't match actual (" + to_string(actual) + ")");
} }
void FileReader::readEntries(std::list<EntryInfo>& entryList, const char* fileName) { int fileDescriptor = open(fileName, O_RDONLY); if ( fileDescriptor < 0) {
close(fileDescriptor); throw FileModifyException("Unable to open output file: " + getErrnoString());
} readEntries(entryList, fileDescriptor); close(fileDescriptor);
}
void FileReader::readEntries(list<EntryInfo> &entryList, int fileDescriptor) { int numItems; size_t amountRead = read(fileDescriptor, &numItems, sizeof(int)); if ( amountRead <= 0) {
close(fileDescriptor); throw FileModifyException("File is empty/error reading");
}
for (int i=0; i < numItems; i++) { EntryInfo incoming; verifyNumBytes(sizeof(time_t), read(fileDescriptor, &incoming.timestamp, sizeof(time_t))); verifyNumBytes(sizeof(int), read(fileDescriptor, &incoming.itemID, sizeof(int))); char* inputName = new char[50]; verifyNumBytes(50, read(fileDescriptor, inputName, 50 * sizeof(char)));
incoming.itemName = inputName; verifyNumBytes(sizeof(int), read(fileDescriptor, &incoming.quantity, sizeof(int))); verifyNumBytes(sizeof(float), read(fileDescriptor, &incoming.price, sizeof(float))); entryList.push_back(incoming);
} }
void FileReader::addMissingEntries(list<EntryInfo> & entries) { EntryInfo additionalFirst; additionalFirst.timestamp = 1612195200; // (2/1/2020 4 PM GMT) additionalFirst.itemID = 4636152; additionalFirst.itemName = nameFirst; additionalFirst.quantity = 70; additionalFirst.price = 70.99; entries.push_back(additionalFirst);
EntryInfo additionalSecond; additionalSecond.timestamp = 1613412000; //(2/15/2020 6 PM GMT) additionalSecond.itemID = 6530927; additionalSecond.itemName = nameSecond; additionalSecond.quantity = 68; additionalSecond.price = 89.99; entries.push_back(additionalSecond);
}
FileReader.h
//
#ifndef INC_21S_CS3377_PROJECT_FILEREADER_H #define INC_21S_CS3377_PROJECT_FILEREADER_H
#include <list> #include <string> #include "Util.h"
class FileReader { public:
void readEntries(std::list<EntryInfo>& entryList, const char* fileName); void readEntries(std::list<EntryInfo>& entryList, int fileDescriptor); static void addMissingEntries(std::list<EntryInfo>& entries);
private: static std::string getErrnoString(); static void verifyNumBytes(ssize_t expected, ssize_t actual);
};
#endif //INC_21S_CS3377_PROJECT_FILEREADER_H
FileWriter.h
//
#ifndef INC_21S_CS3377_PROJECT_FILEWRITER_H #define INC_21S_CS3377_PROJECT_FILEWRITER_H
#include <list> #include <string> #include "Util.h"
class FileWriter { public:
void addEntry(const EntryInfo& entryInfo); void writeFile(const char* fileToWrite); void writeFile(int fileDescriptor);
private: std::string getErrnoString();
std::list<EntryInfo> entries; };
#endif //INC_21S_CS3377_PROJECT_FILEWRITER_H
Part1SimpleFileModifier.cpp
/////
#include "Part1SimpleFileModifier.h" #include "FileModifyException.h" #include "FileReader.h" #include "FileWriter.h"
using namespace std;
void Part1SimpleFileModifier::modifyAndCopyFile(const char *sourceFile, const char *destFile) { FileReader fileReader; list<EntryInfo> entries; fileReader.readEntries(entries, sourceFile); fileReader.addMissingEntries(entries);
FileWriter fileWriter; for ( EntryInfo info : entries) {
fileWriter.addEntry(info); }
fileWriter.writeFile(destFile);
Part1SimpleFileModifier.h
//////
#ifndef INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H #define INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H
#include "Modifier.h"
class Part1SimpleFileModifier : public Modifier { public:
void doSetup(IOType ioType) override {} void modifyAndCopyFile(const char* sourceFile,
const char* destFile) override; };
#endif //INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H