Cod sursa(job #1347112)

Utilizator alex.bullzAlexandru Lilian alex.bullz Data 18 februarie 2015 19:57:52
Problema Convertor Scor 100
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cctype>


/*
	Switchul true false in functie de contor.
*/
bool state (int num) {
	if (num % 2 == 0)
		return false;
	return true;
}

int main() {
	std::ofstream out;
	std::ifstream in;
	std::string str = "";
	char c;
	std::vector<std::string> vect;
	bool ok = false;

	in.open ("convertor.in");
	
	int count = 0;
	int gcount = 0;
	
	if (in.is_open()) {
		out.open ("convertor.out");

		while (in.get (c)) {
			if (c == '"') {
				++gcount;
				ok = state (gcount);
				continue;
			}
			
			if (ok) {
				str.push_back (c);
				if (in.peek() == '"') {
					vect.push_back (str);
					str = "";
				}
				continue; 
			}

			if (isalnum (c) && ok == false) {
				str.push_back (c);
				if (!isalnum(in.peek())) {
					vect.push_back (str);
					str = "";
				}
			}
		}
	}

	in.close();
	
	/*
		Ce-am facut pana acum a fost sa extrag cuvintele care ma 
		interesau, adica cele pe care le voi folosi in fisierul de 
		tip CVS. Am citit caracter cu caracter, tot ce era intre 
		ghilimele si tot ce era alfanumeric.
	*/

	std::string comp = vect[0];
	int no_obj = 1;	// nr de campuri ale obiectului
	out << vect[0] << ',';
	for (int i = 2; i < vect.size(); i += 2) {
		if (vect[i] == comp) {
			break;
		}

		no_obj++;
		out << vect[i] << ',';
	}
	out << '\n';
	
	/*
		Eu practic am salvat la rand, campurile obiectului urmate 
		imediat de valorile lor. In bucla de mai sus, bag in fisierul 
		de output toate campurile (pana la intalnirea primului inca 
		o data), mergand pe pozitiile pare ale vectorului (buffer).
	*/
	count = 0;
	for (int i = 1; i < vect.size(); i += 2) {
		++count;

		out << vect[i] << ',';

		if (count == no_obj) {
			count = 0;
			if (i == vect.size() - 1)
				break;	// ca sa nu puna new line dupa ultimul
			out << "\n";
		}
	}
	
	/*
		Aici am luat tot ce e pe pozitie impara, adica valori, si le-am 
		adaugat pe rand nou, tinand cont de cate campuri are obiectul 
		(variabila no_obj).
	*/

	out.close();

	return 0;
}