Wytłumaczenie istoty size_t i buforu

0

Witam serdecznie!

Chciałem pojąc istotę size_t i buforu zawartego w nim. Mogę klepać kod dla samego klepania, aby tylko działało, ale chciałem aby ktoś łopatologicznie wytłumaczył mi, na jakiej zasadzie to właściwie działa?

Jeżeli istnieje taka możliwość, chciałbym aby ktoś wytłumaczył mi na podstawie poniższego kodu (kopiowanie danych z jednego pliku do drugiego), na czym polega zmienna Buffer(dlaczego rozmiar tej zmiennej wynosi 1024 x 64?)i działanie "zmiennej" size_t.

#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>


int Copy(char *PathToSource, char *PathToTarget);

int main()
{
	Copy("source.txt", "target.txt");
	return 0;
}


int Copy(char *PathToSource, char *PathToTarget)
{
	FILE *fSource, *fTarget;

	int Buffer[1024 * 64];
	
	size_t read, written;

	fSource = fopen("source.txt", "r");
	fTarget = fopen("target.txt", "w");

	while (!feof(fSource))
	{
		read = fread((void*)Buffer, sizeof(int), (size_t)(1024 * 64), fSource);
		written = fwrite((void*)Buffer, sizeof(int), (size_t)read, fTarget);
	}
	return 0;
}

2

size_t jest de facto typem unsigned int lub unsigned long long int (zależnie od architektury).

Czytając plik za pomocą funkcji z biblioteki standardowej C musisz posiadać obszar pamięci do którego ten plik będziesz wczytywał.

Deklarując int Buffer[1024 * 64]; tworzysz obszar pamięci o rozmiarze sizeof(int) * 1024 * 64, który jest ciągły.

Funkcja fread przyjmuje wskaźnik na bufor, rozmiar pojedynczego elementu, oraz ilość elementów (i oczywiście wskaźnik na FILE).
Dodatkowo funkcja ta zwraca ile bajtów zostało zapisanych do bufora. Liczba ta nie musi się równać rozmiar pojedynczego elementu * ilość elementów, ponieważ plik może być krótszy. Natomiast wartość ta nigdy nie będzie wyższa niż rozmiar pojedynczego elementu * ilość elementów.

Rozmiar Buffer zależy tylko od programisty. Może być on mniejszy, może być większy. Jeśli chodzi o mniejszy, to wtedy więcej razy będzie musiała się wykonać pętla (więcej odwołań do funkcji fread i fwrite), natomiast gdyby był większy to by zajmował więcej pamięci (a stos nie ma bardzo dużego rozmiaru). Programista musi znaleźć balans pomiędzy tymi dwoma czynnikami i nadać odpowiedni rozmiar bufora.

W kodzie, który podałeś zmienna written nie jest w zasadzie potrzebna, i gdybyś ją usunął to działanie programu nie zmieniłoby się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1