2015-10-21 2 views
0

Я пытаюсь скопировать содержимое одного файла в другой путем перегрузки оператора «=». Я хочу сделать что-то вроде, когда пишу, file2 = file1, содержимое файла1 будет записано в файл2. Но мой код этого не делает. Это то, что я сделал до сих пор.Ошибка копирования содержимого файла в другой с помощью перегрузки оператора

class EasyFile{ 
    std::string fileContent; 
    char* filePath; 
public: 
    EasyFile(char* filePath){ 
     this->filePath = filePath; 
     std::fstream file(filePath); 
     getline(file,fileContent); 
    } 
    char* getFilePath(){ 
     return filePath; 
    } 
    std::string getFileContent(){ 
     return fileContent; 
    } 
    void setContent(std::string content,char* filePath){ 
     std::ofstream file(filePath); 
     file<<content; 
    } 
    void operator=(EasyFile f); 
}; 
void EasyFile::operator=(EasyFile f){ 
    this->setContent(f.getFileContent(),f.getFilePath()); 
} 

int main(int argc,char** argv) 
{ 
    EasyFile efile1(argv[1]); 
    EasyFile efile2(argv[2]); 
    efile2 = efile1; 
    std::string output=""; 
    std::ifstream file(argv[2]); 
    std::getline(file,output); 
    std::cout<<output; 
    return 0; 
} 
+0

Почему 'main()' ничего не возвращает? Кроме того, перегрузки операторов присваивания должны возвращать ссылку на объект, получающий назначение. – owacoder

+2

@owacoder Нет необходимости указывать 'main()' return, по умолчанию используется 'exit (0);'. –

+0

Это правда, но это хорошая практика, чтобы «возвращать» значения из функций, которые определены для возврата значения! – owacoder

ответ

4

Проблема, кажется, исходит из следующей строки в функции setContent:

std::ofstream file(filePath); 

filepath переменных используется это один передается в качестве аргумента (путь происхождения не путь назначения). Вы пытаетесь сделать копию от источника к происхождению.

+1

Хороший аргумент для украшения ваших переменных-членов каким-то образом (вкус к вкусу) – Chad

+0

Woho! это сработало! Спасибо! Ну, это была серьезная ошибка. – Deepeshkumar

3

Я вижу несколько проблем в коде, при условии:

  1. В методе setContent параметр Filepath скрывается Filepath члена, потому что они имеют такое же имя. Поскольку этот метод открывает файл, заданный параметром filePath (а не файл, представленный этим), и записывает значение содержимого параметра. Что вы хотите сделать, так это удалить параметр filePath. Таким образом, он будет записывать содержимое в файл, представленный этим.

  2. В конструкторе, когда вы вызываете getline, вы не читаете весь контент файла, а только читаете первую строку. Чтобы прочитать весь контент, вы должны сделать строки для чтения итераций и добавить их в свою строку. Вы можете сделать это с кодом, как это:

    #include <fstream> 
    #include <string> 
    
    #define BUFF_SIZE 512 
    
    std::string ReadFile(const char* fileName) 
    { 
        std::string ret; 
        std::ifstream ifs(fileName); 
        char buff[BUFF_SIZE]; 
        do { 
        ifs.read(buff, BUFF_SIZE); 
        ret.append(buff, ifs.gcount()); 
        } while (!ifs.eof()); 
    
        return ret; 
    } 
    
  3. Это не важно, что вы пытаетесь сделать, но это хорошо, чтобы держать его в виду. В операторе присваивания целесообразно передать аргумент const ссылкой (const EasyFile & вместо простого EasyFile). Вам нужно будет пометить ваши методы getter как const, добавив ключевое слово const в конце подписи и перед открывающей скобкой.

+0

Спасибо! Будут держать это в виду! – Deepeshkumar

Смежные вопросы