Cod sursa(job #1338709)

Utilizator Tzappy90Mihalache Constantin Tzappy90 Data 10 februarie 2015 12:09:33
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 3.04 kb
#include <string>
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;


class Json
{
	/*
	--Variables--
	values - all values for each element in Json Array
	*/
	private:
		vector<vector<string> > values; 
		vector<string> keys;
		string *raw_json;

		void readRaw(ifstream& raw); /*reads the whole file into a single string*/
		bool getKeys(); /* extract keys */
		bool getValues(); /* extracts values for each element*/
	public:
		Json(); 
		~Json();
		void populate(ifstream& raw);
		void printFormatedCSV(ofstream& out);
};

Json::Json(){}

Json::~Json(){delete raw_json;}

void Json::readRaw(ifstream& raw) //read file;
{
	raw.seekg (0, raw.end);
    int file_length = raw.tellg();
    raw.seekg (0, raw.beg);

    char *buffer = new char [file_length];

	raw.read(buffer,file_length);
	raw_json = new string(buffer);
	
	delete[] buffer;
}

void Json::populate(ifstream& raw)
{
	readRaw(raw);
	getKeys();
	getValues();
}

bool Json::getKeys()
{
	string *temp = new string;
	size_t start=0,end=0; /* beggining and end position of the extracted string */
	for(size_t i=0; i<raw_json->length(); i++)
	{
		switch(raw_json->at(i))
		{
			case '{':
			case ',':
				i++;
				while(raw_json->at(i)==' ' || raw_json->at(i)=='\n' || raw_json->at(i)=='\r') i++;
				if(raw_json->at(i)=='"')
				{
					i++;
					start = i;
					while(raw_json->at(i)!='"') i++;
					end=i;
				}
				else
				{
					start=i;
					while(raw_json->at(i)!=' ' && raw_json->at(i)!='\n' && raw_json->at(i)!='\r' 
						&& raw_json->at(i)!=':') i++;
						end=i;
				}
				*temp=raw_json->substr(start,end-start);
				keys.push_back(*temp);
				start=0;end=0;
				break;
			case ':':
			case ' ':
			case '\n':
			case '\r':
				break;
			case '}':
				delete temp;
				return true;
		}
	}
	return false;
}

bool Json::getValues()
{
	string *temp = new string;
	size_t start=0,end=0,elem=0;
	for(size_t i=0; i<raw_json->length(); i++)
	{
		switch(raw_json->at(i))
		{
			case ':':
				i++;
				while(raw_json->at(i)==' ' || raw_json->at(i)=='\r' || raw_json->at(i)=='\n') i++;
				if(raw_json->at(i)=='"' )
				{
					i++;
					start = i;
					while(raw_json->at(i)!='"') i++;
					end = i;
				}
				else
				{
					start = i;
					while(raw_json->at(i)!=',' && raw_json->at(i)!='}' && raw_json->at(i)!=' ' && raw_json->at(i)!='\n'
						&& raw_json->at(i)!='\r') i++;
					end=i;
				}
				*temp = raw_json->substr(start,end-start);
				values.resize(elem);
				values[elem-1].push_back(*temp);
				break;
			case '}':
			case '"':
			case '[':
			case ' ':
				break;
			case '{':
				elem++;
				break;
			case ']':
				delete temp;
				return true;
		}
	}
	return false;
}

void Json::printFormatedCSV(ofstream& out)
{
	for(size_t i=0; i<keys.size(); i++)
		out<<keys[i]<<',';
	out<<'\n';
	for(size_t i=0; i<values.size(); i++)
	{
		for(size_t j=0; j<values[i].size(); j++)
			out<<values[i][j]<<',';
		out<<'\n';
	}
}
int main()
{
	ifstream f("convertor.in");
	ofstream g("convertor.out");
	Json *data = new Json;

	data->populate(f);
	data->printFormatedCSV(g);

	f.close();
	g.close();
	delete data;
	return 0;
}