Diferente pentru parsare-fisier-intrare intre reviziile #1 si #6

Nu exista diferente intre titluri.

Diferente intre continut:

Acesta este un code demonstrativ pentru parsarea fişierului de intrare
h1. Parsarea fişierului de intrare
 
Parsarea fişierului de intrare constă în prelucrarea fişierului ca şir de caractere şi extragerea informaţiei utile (numere întregi, flotante; cuvinte etc.) folosind proceduri proprii. Avantajul acestei metode este rapiditatea programului. Funcţiile standard pentru citire din fişier găsite în $stdio.h$ sau $iostream$, $fstream$ etc. au dezavantajul că sunt foarte generaliste, permiţând tot soiul de reguli obscure de formatare.
 
Atunci când vă scrieţi parsarea proprie, de obicei includeţi strictul necesar (de exemplu doar numere pozitive, de tipul int, ca la majoritatea problemelor). Mai jos aveţi două bucăţi de cod demonstrative (pentru C şi C++), care se concentrează pe:
 
* citirea unui caracter
* citirea unui număr întreg de tip $int$, fie el şi negativ (puteţi tăia partea cu semnul '-' dacă nu aveţi nevoie)
* citirea unui număr întreg de tip $long long$, fie el şi negativ
 
Pentru parsarea fişierului de ieşire, urmaţi linkul 'http://www.infoarena.ro/parsare-fisier-iesire':http://www.infoarena.ro/parsare-fisier-iesire
 
h2. Cod compatibil cu limbajul C++ şi sintaxa <fstream> (obiectual)
 
Acesta este un cod demonstrativ pentru parsarea fişierului de intrare folosind metoda obiectuală:
 
== code(cpp) |
#include <stdio.h>
#include <ctype.h>
 
class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;
 
	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}
 
public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}
 
	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
 
	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};
==
 
h3. Cum folosim acest cod?
 
Aveţi mai jos un exemplu de utilizare al clasei. Puteţi observa asemanarea între acesta şi clasele din $fstream$. Singura diferenţă notabilă este că nu va putea citi decât $int$ şi $long long$ (şi caractere prin intermediul unei funcţii $private$).
 
== code(cpp) |
int main()
{
	InParser fin("file.in");
	int a;
	long long b;
	fin >> a >> b;
	printf("%lld\n", b + a);
	return 0;
}
==
 
h2. Cod compatibil cu limbajul C (procedural)
 
Acesta este un cod demonstrativ pentru parsarea fişierului de intrare folosind metoda procedurală:
== code(cpp) |
#include <stdio.h>
	return _in_buff[_in_loc];
}
unsigned int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
{
	unsigned int u32 = 0; char c;
	while (!isdigit(c = read_ch()));
	u32 = c - '0';
	int u32 = 0; char c;
	while (!isdigit(c = read_ch()) && c != '-');
	int sgn = 1;
	if (c == '-') {
		sgn = -1;
	} else {
		u32 = c - '0';
	}
	while (isdigit(c = read_ch())) {
		u32 = u32 * 10 + c - '0';
	}
	return u32;
	return u32 * sgn;
}
unsigned long long read_u64() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned long long>
long long read_u64() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned long long>
{
	unsigned long long u64 = 0; char c;
	while (!isdigit(c = read_ch()));
	u64 = c - '0';
	long long u64 = 0; char c;
	while (!isdigit(c = read_ch()) && c != '-');
	long long sgn = 1;
	if (c == '-') {
		sgn = -1;
	} else {
		u64 = c - '0';
	}
	while (isdigit(c = read_ch())) {
		u64 = u64 * 10 + c - '0';
	}
	return u64;
	return u64 * sgn;
}
==
 
h3. Cum folosim acest cod?
 
Aveţi mai jos un exemplu de utilizare al funcţiilor anterior menţionate.
 
== code(cpp) |
int main()
{
	read_init("file.in");
	int a = read_u32();
	long long b = read_u64();
	printf("%lld", b + a);
	return 0;
}
==

Diferente intre securitate:

public
protected

Topicul de forum nu a fost schimbat.