Dynamiczna Tablica i plik binarny

0

Moje zadanie polega na wczytaniu dowolnego testowego pliku binarnego (większego niż 100Mb) do dynamicznie tworzonej tablicy. Dane z pliku mogę potraktować jako typ unsigned short. Na wyjściu program ma stworzyć plik tekstowy w którym wypisze rozmiar utworzonej tablicy oraz jej pierwsze 10 i ostatnie 10 elementów.

Moje główne pytanie brzmi jaki rozmiar tablicy szacunkowo powinien mi wyjść przy dajmy na to 100Mb pliku testowym?

0

Dodam, że na razie zrobiłem coś takiego, ale obawiam się że nie program nie pokazuje mi dobrych wyników:

 #include<fstream>
#include<conio.h>

using namespace std;
	
int main()
{
	int n;
	 unsigned short *tablica; 
	
	//------------------Wczytywanie Danych z Pliku------------------------------

	tablica= new  unsigned short [n];
	FILE * otwieram2 =fopen ("PlikTestowy.exe", "rb");
	fread(tablica,sizeof(unsigned short),n,otwieram2);	
	getch();
	fclose(otwieram2);
	
	ofstream PlikTekstowy;
	
	//-------------------Zapisywanie Danych w pliku .txt------------------------
	PlikTekstowy.open("PlikTekstowy.txt",ios::out);
	if( PlikTekstowy.good() == true )
    {
		PlikTekstowy<<"Rozmiar Utworzonej Tablicy Dynamicznej: "<<n<<endl<<endl;
		PlikTekstowy<<"10 Pierwszych elementow: "<<endl<<endl;
		for(int i=0;i<10;i++)
		PlikTekstowy<<tablica[i]<<endl;
		PlikTekstowy<<endl;
		PlikTekstowy<<"10 Ostatnich elementow: "<<endl<<endl;
		for(int i=0;(n-9+i)<=n;i++)
		PlikTekstowy<<tablica[n-9+i]<<endl;
	}
	delete [] tablica;
	PlikTekstowy.close();
	
}
0

Chodzi Ci o 100 Mega bitów czy 100 Mega bajtów. Bo jak to drugie to powinieneś pisać 100MB (lub jak kto woli 100MiB).
Myślę, że jeżeli masz 100MB danych to tablicę byś musiał mieć rozmiaru około 100MB :P. Jeżeli chodzi o ilość elementów to będzie 10010241024 / sizeof(short)

1

52 428 800
jeśli MB
jeśli Mb to 8 razy mniej

1
fstream plik;

plik.open(nazwa, ios::in | ios::binary); // otwieramy plik
plik.seekg(0, ios::end); // przesuwamy wskaźnik odczytu na koniec pliku
unsigned n = plik.tellg() / sizeof(unsigned short); // odczytujemy pozycję wskaźnika - jako że jest na końcu dostaniemy rozmiar pliku
plik.seekg(0, ios::beg); // przesuwamy wskaźnik z powrotem na początek
unsigned short *tablica = new unsigned short[n]; // znamy rozmiar więc tworzymy tablicę
plik.read((char*)tablica, n * sizeof(unsigned short)); // wczytujemy wszystkie short'y
plik.close(); // zamykamy plik

plik.open(nazwa, ios::out);
// ...

Do tego wypada sprawdzić błędy otwarcia/odczytu, zwłaszcza należy sprawdzić czy udało się odczytać rozmiar (n) zanim utworzymy tablicę.

I jeszcze jedna uwaga. Jeśli program ma działać zarówno na systemach big-endian jak i little-endian to trzeba sobie ustalić jakiego endiana używamy w pliku i podczas wczytywania/zapisywania zamieniać kolejne pary bajtów miejscami jeśli endian systemowy jest różny od tego ustalonego dla pliku.

0

Zrobiłem już to za pomocą wektora, ale dla porównania zaadoptowałem też powyższy kod;)

Mam jeszcze jedno pytanie:
Plik testowy generuję za pomocą programu Dummy, w wyniku działania mojego programu
jako wartości pierwszych 10 i ostatnich 10 elementów dostaję same zera... no i w sumie nie jestem przekonany
czy to dobrze... wiem że to infantylne pytanie, ale nie do końca wiem co się powinno kryć pod tymi bajtami sztucznego pliku...;(

0
for(int i=0;i<10;++i)
                PlikTekstowy<<tablica[i+n-10]<<endl;
1
pumanba2 napisał(a):

jako wartości pierwszych 10 i ostatnich 10 elementów dostaję same zera... no i w sumie nie jestem przekonany
czy to dobrze...
Możesz podglądnąć zawartość pliku jakimś HEX-edytorem to zobaczysz co jest w środku.

Co do użycia vector to można również wczytać doń zawartość pliku "na raz" metodą fstream::read

vec.resize(n); // ustawiamy rozmiar
file.read((char*)&vec.front(), n * sizeof(typ_danych)); // wczytujemy

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