Я попытаюсь сохранить его коротким и конкретным. Я работаю над проектом, который копирует файл, а затем создает точную копию. Я хотел бы улучшить этот проект, чтобы он копировал файл на сервере и отправил эти данные клиенту, который затем воссоздает файл на локальном компьютере. У меня есть клиент/сервер, настроенный с помощью Winsock, и я могу отправить char * между ними с помощью TCP-сокета. Моя проблема заключается в ... подгонке всех данных этого класса в char *. Я предполагаю, что сериализация - лучший способ сделать это, однако я хочу, чтобы код был как можно более простым и, если возможно, очень хотел бы исключить использование библиотек для этого конкретного проекта.Есть ли способ сериализации класса C++ без использования библиотеки?
Вот мой код на самом деле сохранения файла: ч:
#pragma once
#include <fstream>
#include <string>
using namespace std;
class SaveFile{
private:
streampos fileSize;//streampos data type holds current position of the buffer pointer or file pointer
char* memBlock;
string fileName;
public:
SaveFile();
~SaveFile();
streampos getSize();
char* getMemBlock();
};
каст:
#include <iostream>
#include "SaveFile.h"
SaveFile::SaveFile(){//default constructor
cout << "Please enter file directory: ";
cin >> fileName;
//ios::ate means that the get pointer will be positioned at end of the file
ifstream file(fileName, ios::in|ios::binary|ios::ate);
if (file.is_open()){
fileSize = file.tellg();//because get pointer is at end of file, tellg will return size of file in question
memBlock = new char[fileSize];//allocating memory for the file
file.seekg(0, ios::beg);//return get position to beginning of file
file.read(memBlock, fileSize);//read file into memBlock variable
file.close();//close file
//default destructor will take care of cleanup
}
}
SaveFile::~SaveFile(){}//default destructor
streampos SaveFile::getSize(){
return fileSize;
}
char* SaveFile::getMemBlock(){
return memBlock;
}
Вот код для восстановления файла: ч:
#pragma once
#include <fstream>
#include <string>
using namespace std;
class SaveFile{
private:
streampos fileSize;//streampos data type holds current position of the buffer pointer or file pointer
char* memBlock;
string fileName;
public:
SaveFile();
~SaveFile();
streampos getSize();
char* getMemBlock();
};
cpp:
#include <iostream>
#include "WriteFile.h"
WriteFile::WriteFile(SaveFile sf){
cout << "Please enter new file name: ";
cin >> fileName;
ofstream file(fileName, ios::out|ios::binary);
file.write(sf.getMemBlock(), sf.getSize());
file.close();
}
WriteFile::~WriteFile(){}
Пример этого кода в действии будет:
#include "SaveFile.h"
#include "WriteFile.h"
int main(){
SaveFile s;
WriteFile w(s);
}
Так что моя цель здесь каким-то образом сохраняя содержимое класса SAVEFILE к полукокса *, а затем передать, что через сокет TCP для другая машина, которая затем преобразует этот символ * обратно в объект SaveFile и передает его в WriteFile, чтобы он мог воссоздать данный файл.
Любая помощь очень ценится!
Что представляют собой данные 'SaveFile'? – NathanOliver
'SaveFile' и' WriteFile' больше похожи на имена функций, в отличие от имен классов! Пахнет как плохой дизайн классов! – Nawaz
Ах, извините, я включу файл SaveFile.h в одно мгновение. – frank34443