From bd9ffde20d67674041712a6686340b0c619b791b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 15 May 2021 12:31:51 +0300 Subject: minor fixes --- Sem. 02/task2/studentsDatabase.cpp | 253 +++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 Sem. 02/task2/studentsDatabase.cpp (limited to 'Sem. 02/task2/studentsDatabase.cpp') diff --git a/Sem. 02/task2/studentsDatabase.cpp b/Sem. 02/task2/studentsDatabase.cpp new file mode 100644 index 0000000..7f9a5f5 --- /dev/null +++ b/Sem. 02/task2/studentsDatabase.cpp @@ -0,0 +1,253 @@ +#include +#include + +using namespace std; + +const int FIELD_MAX_SIZE = 50; +const int BUFFER_LINE_SIZE = 1024; + +struct OOPstudent +{ + char firstName[FIELD_MAX_SIZE]; + char lastName[FIELD_MAX_SIZE]; + char email[FIELD_MAX_SIZE]; + int fn = 0; + +}; + +int countLines(const char* fileName) +{ + ifstream f(fileName); + if (!f.is_open()) + return -1; + int linesCount = 0; + + while (!f.eof()) + { + char buff[1024]; + f.getline(buff, 1024); + linesCount++; + } + f.close(); + + return linesCount; + +} +// abc,bcd,ab@Abv.bg,fn +void readStudent(const char* input, OOPstudent& student) +{ + int ind = 0; + + // first name + while (input[ind] != ',') + { + student.firstName[ind] = input[ind]; + ind++; + } + student.firstName[ind] = '\0'; + ind++; + + //last name + int lastNameInd = 0; + while (input[ind] != ',') + student.lastName[lastNameInd++] = input[ind++]; + student.lastName[lastNameInd] = '\0'; + ind++; + + //email + int emailInd = 0; + + while (input[ind] != ',') + student.email[emailInd++] = input[ind++]; + student.email[emailInd] = '\0'; + ind++; + + //fn + while (input[ind] != '\0') + (student.fn *= 10) += (input[ind++] - '0'); + +} + +bool saveStudentsToFile(const OOPstudent* studentsCollection, int len, const char* fileName) +{ + ofstream outFile(fileName); + + if (!outFile.is_open()) + return false; + + outFile << "First name, Last name, email, fn" << endl; + + for (int i = 0; i < len; i++) + outFile << studentsCollection[i].firstName << "," << studentsCollection[i].lastName << "," << studentsCollection[i].email << "," << studentsCollection[i].fn << endl; + + outFile.close(); + + return true; +} + +int indexOfFirstSpaceOrTerminatingZero(const char* command) +{ + int ind = 0; + while (*command != ' ' && *command != '\t' && *command != '\0') + { + command++; + ind++; + } + return ind; + +} + +bool printStudent(const OOPstudent* arrayOfStudents, int len, int fn) +{ + for (int i = 0; i < len; i++) + { + if (arrayOfStudents[i].fn == fn) + { + cout << arrayOfStudents[i].firstName << "," << arrayOfStudents[i].lastName << "," << arrayOfStudents[i].email << "," << arrayOfStudents[i].fn << endl; + return true; + } + } + return false; +} +bool editFirstName(OOPstudent* arrayOfStudents, int len, int fn, const char* newFirstName) +{ + for (int i = 0; i < len; i++) + { + if (arrayOfStudents[i].fn == fn) + { + strcpy(arrayOfStudents[i].firstName, newFirstName); + return true; //success! + } + } + return false; //no such student +} +int main() +{ + + cout << "Open file:" << endl << ">"; + + char fileName[BUFFER_LINE_SIZE]; + cin.getline(fileName, BUFFER_LINE_SIZE); + + int studentsCount = countLines(fileName) - 1; // We ignore the first line + + + if (studentsCount <= 0) + { + cout << "Error while reading data from the file " << endl; + return -1; + } + + OOPstudent* studentsCollection = new OOPstudent[studentsCount]; + + + ifstream f(fileName, ios::_Nocreate); + + if (!f.is_open()) + { + cout << "Error!" << endl; + delete[] studentsCollection; + return -1; + } + + int line = 1; + while (!f.eof()) + { + char buff[BUFFER_LINE_SIZE]; + f.getline(buff, BUFFER_LINE_SIZE); + + if (line == 1) + { + line++; + continue; + } + + readStudent(buff, studentsCollection[line - 2]); + line++; + } + f.close(); + + cout << "File successfully opened!" << endl; + + char commandLine[BUFFER_LINE_SIZE]; + do + { + cout << ">"; + cin.getline(commandLine, 1024); + size_t len = strlen(commandLine); + + + + //first argument (edit, save ...) + size_t firstArgSize = indexOfFirstSpaceOrTerminatingZero(commandLine); + char* commandFirstArg = new char[firstArgSize + 1]; + + for (int i = 0; i < firstArgSize; i++) + commandFirstArg[i] = commandLine[i]; + commandFirstArg[firstArgSize] = '\0'; + + + + + if (len == firstArgSize) //no more arguments - quit? Check is bellow + continue; + + //second argument (students.csv, 45543 ...) + size_t secondArgSize = len - firstArgSize - 1; + char* commandSecondArg = new char[secondArgSize + 1]; + + for (int i = 0; i < secondArgSize; i++) + commandSecondArg[i] = commandLine[firstArgSize + 1 + i]; + commandSecondArg[secondArgSize] = '\0'; + if (strcmp(commandFirstArg, "print") == 0) + { + int fn = atoi(commandSecondArg); + + bool res = printStudent(studentsCollection, studentsCount, fn); + + if (!res) + cout << "Student with fn: " << fn << " doesn't exist!" << endl;; + } + else if (strcmp(commandFirstArg, "edit") == 0) + { + int fn = atoi(commandSecondArg); + + //we have a third argument here. It's in the second arguments string + + size_t seprator = indexOfFirstSpaceOrTerminatingZero(commandSecondArg); + + size_t thirdArgumentSize = secondArgSize - seprator; + char* commandThirdArg = new char[thirdArgumentSize + 1]; + + for (int i = 0; i < thirdArgumentSize; i++) + commandThirdArg[i] = commandSecondArg[seprator + 1 + i]; + commandThirdArg[thirdArgumentSize] = '\0'; + + bool result = editFirstName(studentsCollection, studentsCount, fn, commandThirdArg); + + if (result) + cout << "Succesfully changed name!" << endl; + else + cout << "Student with fn: " << fn << "doesn't exist!" << endl; + + delete[] commandThirdArg; + } + else if (strcmp(commandFirstArg, "save") == 0) + { + + bool res = saveStudentsToFile(studentsCollection, studentsCount, commandSecondArg); + + if (res) + cout << "Successfully saved to file: " << commandSecondArg << endl; + else + cout << "Error while saving in file: " << commandSecondArg << endl; + + } + delete[] commandFirstArg; + delete[] commandSecondArg; + + } while (strcmp(commandLine, "Quit")); + + delete[] studentsCollection; + return 0; +} -- cgit v1.3.1-23-gd82d