'How to edit and delete csv records
I am working on a program through Xcode, it is supposed to read a file and perform various functions:
- displayMenu,
- doDisplay,
- doView,
- doAdd,
- doEdit,
- doDelete.
I have gotten it all to work except the do edit and do delete functions, and I can't find anything online that helps with my particular situation.
The user is supposed to pick the course they want to edit, and be able to edit the term, year, start date, end date, etc.
Thank you in advance.
Here is my code attached.
Here are instructions if you are curious:
Course Menu
=====================
d - Display list of courses
v - View course details
a - Add a course
e - Edit a course
d - Delete a course
x - Exit program
Requirements
- Given a comma-delimited text file named courses.csv Download courses.csv(click to download) that stores the starting data for the program.
A course is an organized presentation about a particular subject that includes Term, Year, Start Date, End Date, Course Name, Class ID, Section, Meeting Days, Location (online, hybrid, or on-campus), Meeting Information, Instructor, Units.
- For the view, edit, and delete commands, display an error message if the user selects an invalid course.
- Define a data structure to store the data for each course.
- When you start the program, it should read the contacts from the comma-delimited text file and store them in a vector of courses.
- When reading data from the text file, you can read the line and separate the field by an all text up to the next comma (ex. getline() function).
- When you add, edit or delete a contact, the change should be saved to the text file immediately. That way, no changes are lost, even if the program crashes later.
- For demonstration, you need to be able to view/add/edit/delete at least 3 courses listed
Here is my code: https://pastebin.com/HkEE9HBD
////myApp.cpp
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include "course.h"
#include "utils.h"
using namespace std;
char menu();
int main() {
vector<courseType> list;
readData(list);
char ch = 'x';
do {
cout << endl;
ch = menu();
switch (ch) {
case 'l':
// function handler
doDisplay(list);
break;
case 'v':
doView(list);
break;
case 'a':
doAdd(list);
break;
case 'e':
doEdit(list);
break;
case 'd':
doDelete(list);
break;
default:
cout << "Please enter valid choice" << endl;
}
} while (ch != 'x');
cout << "Exit the program" << endl;
return 0; // exit the program successfully
}
/**
* Display application menu
*/
char menu() {
cout << "Course Menu" << endl;
cout << "=====================" << endl;
cout << "l - Display list of courses" << endl;
cout << "v - View course details" << endl;
cout << "a - Add a course" << endl;
cout << "e - Edit a course" << endl;
cout << "d - Delete a course" << endl;
cout << "x - Exit program" << endl << endl;
cout << "Enter choice: ";
char ch;
cin >> ch;
cout << endl;
return ch;
}
//courseImp.cpp
#include <string>
#include "course.h"
#include <iostream>
using namespace std;
courseType::courseType() {
term = "";
year = 0.0;
startDate = "";
endDate = "";
courseName = "";
section = "";
classID = 0.0;
meetingDays = "";
location = "";
meetingInfo = "";
instructor = "";
units = 0.0;
}
courseType::~courseType() {
}
//List of Acessor and Getter Methods For Each Variable
void courseType::setTerm(string term) {
this ->term = term;;
}
string courseType::getTerm() {
return term;
}
void courseType::setYear(string temp) {
this ->temp = temp;
}
string courseType::getYear() {
return temp;
}
void courseType::setStart(string startDate) {
this ->startDate = startDate;
}
string courseType::getStart() {
return startDate;
}
void courseType::setEnd(string endDate) {
this ->endDate = endDate;
}
string courseType::getEnd() {
return endDate;
}
void courseType::setName(string courseName) {
this ->courseName = courseName;
}
string courseType::getName() {
return courseName;
}
void courseType::setSection(string section) {
this ->section = section;
}
string courseType::getSection() {
return section;
}
void courseType::setID(string tempC) {
this->tempC = tempC;
}
string courseType::getID() {
return tempC;
}
void courseType::setDays(string meetingDays) {
this ->meetingDays = meetingDays;;
}
string courseType::getDays() {
return meetingDays;
}
void courseType::setLocation(string location) {
this ->location = location;
}
string courseType::getLocation() {
return location;
}
void courseType::setInfo(string meetingInfo) {
this ->meetingInfo = meetingInfo;
}
string courseType::getInfo() {
return meetingInfo;
}
void courseType::setInstructor(string instructor) {
this ->instructor = instructor;
}
string courseType::getInstructor() {
return instructor;
}
void courseType::setUnits(string tempU) {
this ->tempU = tempU;
}
string courseType::getUnits() {
return tempU;
}
//utils.cpp
#include <iostream>
#include <iomanip>
#include "utils.h"
#include "course.h"
#include <cstdlib>
#include <iostream>
#include <utility>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
//Function Dislays list of Courses
void doDisplay(vector<courseType>& list) {
cout << left << setw(10) << "Course List" << endl;
cout << "==============================" << endl;
for(int i = 0; i < list.size(); i++){
cout << left << setw(10) << list[i].getName() << "" << endl << endl;
}
}
//Function views individual course
void doView(vector<courseType>& list) {
int chv = 0;
for(int i = 0; i < list.size(); i++){
cout << i+1 << ". " << list[i].getName() << "" << endl << endl;
}
cout << "Please choose a course you want to view: ";
cin >> chv;
cout << endl;
if(chv<list.size()+1)
{
cout << left << setw(10) << "Term" << setw(10) << "Year"
<< setw(15) << "Start Date" << setw(15) << "End Date"
<< setw(35) <<"Course Name" << setw(15) << "Section"
<< setw(12) << "Class ID" << setw(17) << "Meeting Days"
<< setw(15) << "Location" << setw(20) << "Meeting Info"
<< setw(15) << "Instructor" << "Units" << endl;
cout << "=============================================================================================";
cout << "=============================================================================================" << endl;
chv=chv-1;
cout << left << setw(10) << list[chv].getTerm() << "" << setw(10) << list[chv].getYear() <<
"" << setw(15) << list[chv].getStart() << "" << setw(15) << list[chv].getEnd() << "" <<
setw(35) << list[chv].getName() << "" << setw(15) << list[chv].getSection() << "" <<
setw(15) << list[chv].getID() << "" << setw(15) << list[chv].getDays() << "" <<
setw(17) << list[chv].getLocation() << "" << setw(20) << list[chv].getInfo() << "" <<
setw(15) << list[chv].getInstructor() << "" << setw(10) << list[chv].getUnits() << "" << endl;
}
}
//Function Adds Courses
void doAdd(vector<courseType>& list) {
char choice;
char delim = ',';
string term = "";
float year = 0.0;
string start = "";
string end = "";
string name = " ";
string section = "";
float id = 0.0;
string days = "";
string location = "";
string info = "";
string instructor = "";
float units = 0.0;
ofstream outMyStream (FILE_NAME, ios::app);
do {
cout << "Enter term: " ;
cin.ignore();
getline(cin, term);
cout << "Enter year: ";
cin >> year;
cin.ignore();
cout << "Enter start date: ";
getline(cin, start);
cout << "Enter end date: ";
getline(cin, end);
cout << "Enter course name: ";
getline(cin, name);
cout << "Enter course section: ";
getline(cin, section);
cout << "Enter course ID: ";
cin >> id;
cin.ignore();
cout << "Enter meeting Days : ";
getline(cin, days);
cout << "Enter meeting location: ";
getline(cin, location);
cout << "Enter meeting information: ";
getline(cin, info);
cout << "Enter instructor name: ";
getline(cin, instructor);
cout << "Enter units: ";
cin >> units;
cin.ignore();
outMyStream << term << delim << year << delim << start << delim << end << delim << name << delim << section << delim
<< id << delim << days << delim << location << delim << info << delim << instructor << delim << units << endl;
cout << "\nEnter another Record? (Y/N) ";
cin >> choice;
if (choice != 'Y' and choice != 'y' and choice != 'N' and choice != 'n') // if needed add input
cout << choice << " is not a valid option. Try agian" << endl;
}while (choice != 'N' && choice != 'n');
{
outMyStream.close();
}
}
//Function Edits Courses
void doEdit(vector<courseType>& list) {
}
//Function Deletes Courses
void doDelete(vector<courseType>& list) {
}
//Function Reads Data from "courses.csv"
void readData(vector<courseType>& list) {
ifstream inFile;
fstream fin;
inFile.open(FILE_NAME);
string line;
while (getline(inFile, line)) {
string term;
float year;
string startDate;
string endDate;
string courseName;
string section;
float classID;
string meetingDays;
string location;
string meetingInfo;
string instructor;
float units;
string temp;
string tempU;
string tempC;
stringstream ss(line);
getline(ss, term, ',');
getline(ss, temp, ',');
year = atoi(temp.c_str());
getline(ss, startDate, ',');
getline(ss, endDate, ',');
getline(ss, courseName, ',');
getline(ss, section, ',');
getline(ss,tempC,',');
classID = atoi(tempC.c_str());
getline(ss, meetingDays, ',');
getline(ss, location, ',');
getline(ss, meetingInfo, ',');
getline(ss, instructor, ',');
getline(ss,tempU,',');
units = atoi(tempU.c_str());
courseType c;
c.setTerm(term);
c.setYear(temp);
c.setStart(startDate);
c.setEnd(endDate);
c.setName(courseName);
c.setSection(section);
c.setID(tempC);
c.setDays(meetingDays);
c.setLocation(location);
c.setInfo(meetingInfo);
c.setInstructor(instructor);
c.setUnits(tempU);
list.push_back(c);
}
inFile.close();
}
//course.h
#pragma once
#include <string>
#include <sstream>
using namespace std;
class courseType {
public:
// mutator methods - set
void setTerm(string term);
void setYear(string temp);
void setStart(string startDate);
void setEnd(string endDate);
void setName(string courseName);
void setSection(string section);
void setID(string tempC);
void setDays(string meetingDays);
void setLocation(string location);
void setInstructor(string instructor);
void setInfo(string meetingInfo);
void setUnits(string tempU);
// ...
// accessor methods - get
string getTerm();
string getYear();
string getStart();
string getEnd();
string getName();
string getSection();
string getID();
string getDays();
string getLocation();
string getInstructor();
string getInfo();
string getUnits();
// ...
// Other member methods
// ...
courseType();
~courseType();
protected:
// tbd
private:
// data structures
string term;
float year;
string startDate;
string endDate;
string courseName;
string section;
float classID;
string meetingDays;
string location;
string meetingInfo;
string instructor;
float units;
string temp;
string tempU;
string tempC;
};
//utils.h
#pragma once
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include "course.h"
using namespace std;
const string FILE_NAME = "courses.csv";
// Prototype functions...
void doDisplay(vector<courseType>& list);
void doView(vector<courseType>& list);
void doAdd(vector<courseType>& list);
void doEdit(vector<courseType>& list);
void doDelete(vector<courseType>& list);
void readData(vector<courseType>& list);
//courses.csv
Spring,2022,1/24/2022,5/20/2022,Discrete Structures,CS-113-02,085689,T TH,On-Campus,Newark,Pham,3
Spring,2022,1/24/2022,5/20/2022,Programming W/ Data Structures,CS-124-02,084371,M W,On-Campus,Zoom,Pham,3
Spring,2022,1/24/2022,5/20/2022,Programming W/ Data Structures,CS-124-03,085698,T TH,Online,Newark,Pham,3
Spring,2022,1/24/2022,5/20/2022,JavaScript for Web Development,CS-175-01,084377,M,Online,Zoom,J. Pham,4
Spring,2022,1/24/2022,5/20/2022,Beginner Java,CS-125-05,089434,TH,Online,Zoom,Gao,3
Solution 1:[1]
Ah, college professors... Store things in csv files but act like it's a database.
What I would do is design a set of classes that mirror your data. So you'd have a class called Course (for instance). And you'd have another called Curriculum, perhaps, and it would store a std::vector of Courses.
You would then need a readFromCSV and writeToCSV pair of methods. You would want more methods for the various actions you have to perform, and any methods that modify data should then call writeToCSV automatically.
Does that make sense?
You can build it by first just writing the read and write methods and just make sure your output file looks identical to your input file.
Then start implementing the data update methods, one at a time.
Not too bad.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Joseph Larson |
