Pagini recente » Cod sursa (job #3276580) | Cod sursa (job #932797) | Cod sursa (job #1313341) | Cod sursa (job #2433125) | Cod sursa (job #1347889)
#include <fstream>
#include <string>
using namespace std;
class MyConverter
{
ifstream f;
ofstream g;
const int MAXSIZE;
char* buffer;
bool isDigit(char c);
void add_value(int &poz, char &c);
void print_value();
public:
MyConverter(const char* in_name, const char* out_name);
void Initialize();
int first_keyvalues();
void next_values();
void print_firstvalues();
~MyConverter();
};
bool MyConverter::isDigit(char c)
{
if ((int)c >= 48 && (int)c <= 57)
return true;
else
return false;
}
void MyConverter::add_value(int &poz, char &c)
{
//adauga o valoare in buffer
//presupunem ca ne aflam pe pozitia caracterului :
while (1)
{
f.get(c);
if (c == '"')
{
//value is string
f.get(c);
do
{
buffer[poz++] = c;
f.get(c);
}
while (c != '"');
buffer[poz++] = ',';
break;
}
else
if (isDigit(c))
{
//value is number
while (isDigit(c))
{
buffer[poz++] = c;
f.get(c);
}
buffer[poz++] = ',';
break;
}
}
}
void MyConverter::print_value()
{
//presupunem ca ne aflam pe pozitia caracterului :
char c;
while (1)
{
f.get(c);
if (c == '"')
{
//value is string
f.get(c);
do
{
g << c;
f.get(c);
}
while (c != '"');
g << ",";
break;
}
else
if (isDigit(c))
{
//value is number
while (isDigit(c))
{
g << c;
f.get(c);
}
g << ",";
break;
}
}
}
MyConverter::MyConverter(const char* in_name, const char* out_name) : MAXSIZE(600000)
{
f.open(in_name);
g.open(out_name);
}
void MyConverter::Initialize()
{
buffer = new char[MAXSIZE];
}
int MyConverter::first_keyvalues()
{
//parcurge fisierul pana la intalnirea caracterului }
//memoreaza valorile in buffer
//afiseaza cheile
int poz = 0;
char c;
//first key
f.get(c);
while (c != '"')
f.get(c);
f.get(c);
while (c != '"')
{
g << c;
f.get(c);
}
g << ",";
//first value
f.get(c);
while (c != ':')
f.get(c);
add_value(poz, c);
//next key/values
while (c != '}')
{
//key
while (c != ',')
{
//check to see if the last key has been printed
if (c == '}')
{
buffer[poz] = '\0';
g << endl;
return 1;
}
f.get(c);
}
f.get(c);
while (c != '"')
f.get(c);
f.get(c);
while (c != '"')
{
g << c;
f.get(c);
}
g << ",";
//value
f.get(c);
while (c != ':')
f.get(c);
add_value(poz, c);
}
buffer[poz] = '\0';
g << endl;
return 1;
}
void MyConverter::next_values()
{
//afiseaza valorile dupa primul caracter }, randurile 3+ la output
char c;
f.get(c);
while (c != ']')
{
if (c == ':')
{
print_value();
}
if (c == '{')
g << endl;
f.get(c);
}
}
void MyConverter::print_firstvalues()
{
g << buffer;
}
MyConverter::~MyConverter()
{
delete(buffer);
f.close();
g.close();
}
int main(void)
{
{
MyConverter C("convertor.in", "convertor.out");
C.Initialize();
C.first_keyvalues();
C.print_firstvalues();
C.next_values();
}
return 0;
}