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

Nu exista diferente intre titluri.

Diferente intre continut:

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
 
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;
	}
};
==
 
h2. Cod compatibil cu limbajul C (procedural)
 
Acesta este un cod demonstrativ pentru parsarea fişierului de intrare folosind metoda procedurală:
Acesta este un code demonstrativ pentru parsarea fişierului de intrare
== code(cpp) |
#include <stdio.h>
	return _in_buff[_in_loc];
}
int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
unsigned int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
{
	int u32 = 0; char c;
	while (!isdigit(c = read_ch()) && c != '-');
	int sgn = 1;
	if (c == '-') {
		sgn = -1;
	} else {
		u32 = c - '0';
	}
	unsigned int u32 = 0; char c;
	while (!isdigit(c = read_ch()));
	u32 = c - '0';
	while (isdigit(c = read_ch())) {
		u32 = u32 * 10 + c - '0';
	}
	return u32 * sgn;
	return u32;
}
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 read_u64() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned long long>
{
	long long u64 = 0; char c;
	while (!isdigit(c = read_ch()) && c != '-');
	long long sgn = 1;
	if (c == '-') {
		sgn = -1;
	} else {
		u64 = c - '0';
	}
	unsigned long long u64 = 0; char c;
	while (!isdigit(c = read_ch()));
	u64 = c - '0';
	while (isdigit(c = read_ch())) {
		u64 = u64 * 10 + c - '0';
	}
	return u64 * sgn;
	return u64;
}
==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.