Cod sursa(job #1341490)
Utilizator | Data | 12 februarie 2015 19:44:47 | |
---|---|---|---|
Problema | Convertor | Scor | 100 |
Compilator | cpp | Status | done |
Runda | rosedu_cdl_2015 | Marime | 4.9 kb |
#include <fstream>
#include <string>
using namespace std;
enum Expectation{
KEY , KEY_END , VALUE_START , VALUE_END_STRING , VALUE_END_INT , COLON , BRACE_OPEN , BRACKET_OPEN
};
bool isDigit(char c){
string digits = "0123456789";
for(unsigned int i=0;i<digits.length();++i){
if(c == digits[i]){
return true;
}
}
return false;
}
int main(){
ifstream _scan("convertor.in");
ofstream _print("convertor.out");
string buffer = "",firstLine = "",currentLine = "";
Expectation expected = BRACKET_OPEN;
bool first = true;
bool openFile = true;
expected = BRACKET_OPEN;
while(getline(_scan,buffer) && openFile){
for(unsigned int current = 0; current < buffer.length() ; ++current){
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;
}