==> class MessageAssembler { This function has over 60 lines. You need to split it into smaller functions
==> At least one function in your code must use 'call by reference'. You do not appear to have done this in your program.
Can anyone help me with restructuring my code so that it makes my tutor happy? I'm a little wary of changing it on my own as it works perfectly now it just isn't formatted how she wants it.
Code:#include<iostream>
#include<fstream>
#include<list>
#include<string>
#include<iomanip>
#include<string.h>
#include<cstdlib>
using namespace std;
class Packet {
int sequenceNumber;
string content;
public:
Packet(int sequenceNumber, string content)
{
this->sequenceNumber = sequenceNumber;
this->content = content;
}
int getSequenceNumber()
{
return sequenceNumber;
}
string getContent()
{
return content;
}
};
class Message {
list<Packet> pList;
int id;
public:
Message(int id)
{
this->id = id;
}
~Message()
{
pList.clear();
}
int getID()
{
return id;
}
void print()
{
for(list<Packet>::iterator it = pList.begin(); it!=pList.end(); it++)
cout<<it->getContent()<<endl;
}
void addPacket(Packet pac)
{
for(list<Packet>::iterator it = pList.begin(); it!=pList.end(); it++)
{
if(pac.getSequenceNumber() < it->getSequenceNumber())
{
pList.insert(it, pac);
return ;
}
}
pList.push_back(pac);
}
};
class MessageAssembler {
static const int BUFFER_SIZE = 100;
public:
static list<Message>* assembleFromFile(char *fileName)
{
FILE *file;
file = fopen(fileName, "r");
if(file==NULL || ferror(file))
{
cout<<"ERROR - Unable to open message file to read"<<endl<<endl;
exit(0);
}
char *buffer = new char[BUFFER_SIZE];
list<Message> *mList = new list<Message>();
while(1)
{
fgets(buffer, BUFFER_SIZE, file);
string line(buffer, strlen(buffer)-1);
if(line == "END") break;
int messageID = atoi( line.substr(0, 3).c_str() );
int sequenceNumber = atoi( line.substr(4, 3).c_str() );
string content = line.substr(8);
bool found = false;
for(list<Message>::iterator it = mList->begin();
it!=mList->end(); it++)
{
if(it->getID() == messageID)
{
found = true;
it->addPacket(Packet(sequenceNumber, content));
break;
}
if(messageID < it->getID())
{
it = mList->insert(it, Message(messageID));
it->addPacket(Packet(sequenceNumber, content));
found = true;
break;
}
}
if(!found)
{
mList->push_back(Message(messageID));
mList->back().addPacket(Packet(sequenceNumber, content));
}
}
fclose(file);
delete buffer;
return mList;
}
};
int main(int argc, char** argv)
{
char *fileName;
if(argc < 2)
{
cout<<"ERROR - Must supply 1 argument to packet"<<endl<<endl;
exit(0);
}
fileName = *(argv+1);
list<Message> *mList = MessageAssembler::assembleFromFile(fileName);
for(list<Message>::iterator it = mList->begin(); it!=mList->end(); it++)
{
cout<<"Message "<<setw(3)<<setfill('0')<<it->getID()<<endl;
it->print();
cout<<endl;
}
mList->clear();
return 0;
}