Zapis danych z tablicy do pliku .bin

0

Hej ponownie, mam problemik tym razem z programikiem który losuje 100 liczb, a następnie wrzuca je do pliku z rozszerzeniem .bin .
Program nie działa. Muszę tu użyć fread i fwrite. Jednak z tym kodem co mam to nie wychodzi.

for (i = 0; i < 100; i++) {
    tab[i] = (rand() % 198) - 99;
        tab[i];
    fwrite(tab[i], sizeof(tab[i]), 1, fp);
}
1

Nie pamiętam kolejności parametrów fwrite, więc zakładam, że użyłeś dobrej. Musisz podać adres wartości, którą chcesz zapisać, a nie samą wartość, a więc:

fwrite(&tab[i], sizeof(tab[i]), 1, fp);
// lub
fwrite(tab + i, sizeof(tab[i]), 1, fp);

Alternatywnie, możesz po całej pętli po prostu zapisać całą tablicę:

fwrite(tab, sizeof(tab), 1, fp);
0

Oke, niby zapisało. Teraz próbowałem użyć fread żeby zobaczyć czy jest git bo inaczej się nie da chyba ale wywala znowu exceptiony.

0

Daję cały kod może to coś da bo serio już nie mam pojęcia.

int main(void)
{

FILE *fp;

int a;
int i;
int tab[100];
_mkdir("c:\\XD");
fopen_s(&fp, "c:\\XD\\test.txt", "w+");

for (i = 0; i < 100; i++) {
	tab[i] = (rand() % 198) - 99;
	fwrite(&tab[i], sizeof(tab[i]), sizeof(tab), fp);
	fread(&tab1, sizeof(tab1), sizeof(tab1), fp);
}

system("Pause");
return 0;

}

1

https://en.cppreference.com/w/c/io/fopen

In update mode ('+'), both input and output may be performed, but output cannot be followed by input without an intervening call to fflush, fseek, fsetpos or rewind, and input cannot be followed by output without an intervening call to fseek, fsetpos or rewind, unless the input operation encountered end of file. In update mode, implementations are permitted to use binary mode even when text mode is specified.

PS: nie masz nigdzie tab1

0

Dobra doszedłem do czegoś takiego:

screenshot-20190109200026.png

Ale to dalej nie to :C

1

Poza flushem musisz jeszcze przestawić wskaźnik w pliku (fseek).

Jest jakiś powód dla którego chcesz to wszystko zrobić w jednej pętli? Zamiast po prostu później otworzyć plik drugi raz, do odczytu, i sobie to wypisać jak człowiek?

0

Zrobione, ale chyba dałem ciała już przy fwrite he.
screenshot-20190109202036.png

1

Otwierasz fp1, używasz dalej fp

Przy fread wczytuj po jednym elmencie, a nie po sizeof(tab1[i])

0

Poprawione, ale dalej ten sam błąd.

0

A no rzeczywiście, zmieniłem i jest lekki progres. Wyświetla pierwszą liczbę jaką wylosowało a reszta to nie wiem co to.
screenshot-20190109204912.png

1

Pokaż kod. Najlepiej nie jako screenshot.

0
int main(void)
{

	FILE *fp, *fp1;

	int a;
	int i;
	int tab[100];

	_mkdir("c:\\XD");
	fopen_s(&fp, "c:\\XD\\test.txt", "w+");
	
	for (i = 0; i < 100; i++) {
		tab[i] = (rand() % 198) - 99;
		fwrite(&tab[i], sizeof(tab[i]), sizeof(1), fp);
	}
	fclose(fp);
	fopen_s(&fp1, "c:\\XD\\test.txt", "r");
	fseek(fp1, 0, SEEK_SET);
	for (i = 0; i < 100; i++) {
		fread(&tab[i], sizeof(tab[i]), 1, fp1);
		printf_s("%d \n", tab[i]);
	}


	system("Pause");
	return 0;
}

1

fwrite(&tab[i], sizeof(tab[i]), sizeof(1), fp); - sizeof(1) to na większości systemów 4, Ty chciałeś po prostu 1.

Teraz ten fseek jest zbędny, ale nie powinien nic zmienić.

0

Ano, zamieniłem na 1 ale dalej nie działa. Strasznie mało materiałów jest w internecie, tj przykładów z wykorzystaniem w tym tablicy int w ten sposób.

1

Nie zamykasz fp1, ale to nie powinno mieć tu znaczenia. Kod dla mnie wygląda ok. Sprawdź hex edytorem czy zapis jest udany.

0

Pobrałem, zainstalowałem. Otworzyłem plik tym. I wyświetliło się to:
screenshot-20190109212517.png

1

Przyznam, że nie widzę powodu aby tak się działo. Być może umyka mi coś oczywistego. Jak wygląda zawartość pliku gdy go usuniesz i uruchomisz program jeszcze raz?

0

Ło baben, działa! Dzięki kq! <3

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