Я пытаюсь открыть файл для чтения после запроса у пользователя пути к файлу и имени файла (например, «home / user / Downloads / file.csv»), после чего я пытаюсь записать данные из этого файла и разобрать его в новый в том же каталоге, но теперь с добавлением «new_» к имени файла.
Я думаю, что собираюсь неправильно записать каждую строку в вектор со следующим l oop.
while (getline(ifs, line)) {
Record newRecord(line);
int i = 0;
int n = 0;
//check for duplicate entry, if found ignore.
if((newRecord == records[i]) || (i < n) ){
i++;
}
else{
records.push_back(newRecord);
n++;
i = 0;
}
}
, это должно быть сравнение записи со всеми предыдущими, чтобы сделать уверен, что это не дубликат, и если это так, он пропустит его.
Следующее в остальной части моего кода.
main. cpp
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <libgen.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include "Record.h"
using namespace std;
int main() {
vector<Record> records; //vector of type Records to hold each "Line" of input file
string filename; // File name and path stored as string
/**
* Prompts user for the name of input file and stores in string variable filename
*
*/
cout << "please enter the name of your file with file path:" << endl;
cin >> filename;
ifstream ifs { filename.c_str() };
if (!ifs) {
cerr << " Can't open file " << filename << endl;
return 1;
}
string path = filename.substr(0, filename.find_last_of("\\/"));
string file = filename.substr(filename.find_last_of("\\/") + 1,
filename.length());
if (path.compare(file) == 0) {
path == "";
}
//test for file and file path
cout << "Path portion of " << filename << " is " << path << endl; //
cout << "File portion of " << filename << " is " << file << endl; // path + "new_" + file + ".cvs", make new file with new path
/**
* Put each line of input file in to the records vector
*/
string line; //strings for each parameter of the vector object
while (getline(ifs, line)) {
Record newRecord(line);
int i = 0;
int n = 0;
//check for duplicate entry, if found ignore.
if((newRecord == records[i]) || (i < n) ){
i++;
}
else{
records.push_back(newRecord);
n++;
i = 0;
}
}
ifs.close(); //closes the stream
//create new file and output data to it
string newFile = ("new_" + file + ".cvs");
//check to see if file path and file name are correct
cout << (path + newFile);
//Open stream to new file and write to it
ofstream ofs(path + newFile);
for(size_t i = 0; i < records.size(); i++){
ofs << records[i];
}
return 0;
}
Запись. cpp
#include <string>
#include "Record.h"
using namespace std;
Record::Record(string s) {
}
Record::~Record() {
}
//overloaded "=="
bool operator ==(const Record &lhs, const Record &rhs){
return (lhs.cost == rhs.cost && lhs.department == rhs.department &&
lhs.item_code == rhs.item_code && lhs.quantity == rhs.quantity);
}
//Overloaded "<<" operator
std::ostream& operator <<(std::ostream& os, const Record& r){
os << r.department << ',' << r.item_code << ',' << r.quantity << ',' << r.cost;
return os;
}
Запись. Ч
#ifndef RECORD_H_
#define RECORD_H_
#include <iostream>
#include <string>
class Record {
public:
//Constructor
Record(std::string s); //pass this string to Record class
//De-constructor
virtual ~Record();
//overloaded "=="
friend bool operator ==(const Record &a, const Record &b);
//Overloaded "<<" operator
friend std::ostream& operator <<(std::ostream&, const Record&);
private:
std::string department;
std::string item_code;
int quantity;
double cost;
};
#endif /* RECORD_H_ */