Чтение из файла, анализ данных и запись в новый файл на c ++ - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь открыть файл для чтения после запроса у пользователя пути к файлу и имени файла (например, «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_ */
...