Pagini recente » Cod sursa (job #2168127) | Cod sursa (job #2490431) | Cod sursa (job #1341131) | Cod sursa (job #521127) | Cod sursa (job #1341507)
#include <fstream>
#include <string>
using namespace std;
enum Expectation{ // care e urmatorul eveniment pe care il astept
KEY, // inceputul unei chei (")
KEY_END, // sfarsitul unei chei (")
VALUE_START, // inceputul unei valori (numar sau ")
VALUE_END_STRING, // sfarsitul unei valori string (")
VALUE_END_INT, // sfarsitul unei valori int (blank sau , sau })
COLON, // :
BRACE_OPEN, // inceputul unei entitati din "tabel"
BRACKET_OPEN // inceputul fisierului
};
// testez daca c este cifra
bool isDigit(char c){
string digits = "0123456789";
for(unsigned int i=0;i<digits.length();++i){
if(c == digits[i]){
return true;
}
}
return false;
}
// se presupune ca fisierul e scris in formatul dat
int main(){
ifstream scan("convertor.in");
ofstream print("convertor.out");
string buffer = "",firstLine = "",currentLine = "";
Expectation expected = BRACKET_OPEN; // astept inceputul "documentului"
bool first = true; // false cand termin de citit prima entitate si stiu sa scriu in fisierul destinatie prima linie
bool openFile = true; // false cand intalnesc caracterul "]" deci se termina "documentul"
expected = BRACKET_OPEN; // astept inceputul "documentului"
while(getline(scan,buffer) && openFile){
// pentru fiecare linie din fisier
for(unsigned int current = 0; current < buffer.length() ; ++current){
// pentru fiecare caracter din linie
switch(expected){
case BRACKET_OPEN:{
if(buffer[current] == '['){
expected = BRACE_OPEN;
}
break;
}
case BRACE_OPEN:{
if(buffer[current] == '{'){
expected = KEY;
}
else{
if(buffer[current] == ']'){
openFile = false;
current = buffer.length() + 2;
}
}
break;
}
case KEY:{
if(buffer[current] == '"'){
expected = KEY_END;
}
if(buffer[current] == '}'){
expected = BRACE_OPEN;
if(first){
first = false;
print<<(firstLine + "\n");
print<<(currentLine + "\n");
currentLine = "";
}
else{
print<<(currentLine + "\n");
currentLine = "";
}
}
break;
}
case KEY_END:{
if(first){
if(buffer[current] == '"'){
firstLine += ',';
expected = COLON;
}
else{
firstLine += buffer[current];
}
}
else{
if(buffer[current] == '"'){
expected = COLON;
}
}
break;
}
case COLON:{
if(buffer[current] == ':'){
expected = VALUE_START;
}
break;
}
case VALUE_START:{
if(buffer[current] == '"'){
expected = VALUE_END_STRING;
}
else{
if(isDigit(buffer[current])){
expected = VALUE_END_INT;
currentLine += buffer[current];
}
}
break;
}
case VALUE_END_STRING:{
if(buffer[current] == '"'){
currentLine += ',';
expected = KEY;
}
else{
currentLine += buffer[current];
}
break;
}
case VALUE_END_INT:{
if(buffer[current] == ' ' || buffer[current] == ','){
currentLine += ',';
expected = KEY;
}
else{
if(buffer[current] == '}'){
currentLine += ',';
expected = BRACE_OPEN;
if(first){
first = false;
print<<(firstLine + "\n");
print<<(currentLine + "\n");
currentLine = "";
}
else{
print<<(currentLine + "\n");
currentLine = "";
}
}
else{
currentLine += buffer[current];
}
}
break;
}
} // switch
} // for
} // while
scan.close();
print.close();
return 0;
}