Błąd zapisu tablicy do pliku

0

Witam
Mam pewien problem z zapisem tablicy liczb do pliku. Wywala na instrukcji fwrite z komunikatem z załącznika. "wsk" to oczywiście wskaźnik na tablice. Błąd pojawia się bez względu na to czy plik istnieje czy też nie.
Czy ktoś się orientuje co to może być nie tak? Za wszelką pomoc dziękuje ;)
Poniżej kod funkcji:

void zapisz(int *wsk)
{
	FILE *f1;
	char nazwa[FILENAME_MAX];
	printf("\nPodaj nazwe pliku do którego chcesz zapisać mape: ");
	scanf("%s", nazwa);
	f1 = fopen(nazwa, "wb");
	fwrite(wsk, INT_MAX, 2 * CITYMAX, f1);
	fclose(f1);
} 
1

A wiesz co chcesz zapisać? bo widzę że 2 * CITYMAX elementów o rozmiarze INT_MAX! Zastanów się, czy o to Ci chodzi!

0

Chce zapisac integer'y. To co powinienem wpisać?

1

Mogę co najwyżej się domyslać, nie widząc niczego więcej:

 fwrite(wsk, sizeof(int), 2 * CITYMAX, f1);

Aczkolwiek, nie jest to dobry zapis, trzeba się zdecydować zawsze jakiej wielkości integery zapisywać
więc powinno być np:

 fwrite(wsk, sizeof(int32_t), 2 * CITYMAX, f1);

pamietając, że funkcja zapisz powinna mieć raczej postać:

 void zapisz(int23_t *wsk)

przy okazji apostrof w wyrazie integery jest błędem.

0

http://www.tutorialspoint.com/c_standard_library/c_function_fwrite.htm

drugi argument funkcji fwrite to rozmiar pojedynczego elementu, ktory chcesz zapisac, wiec jesli chcesz zapisac integery, to drugi element to sizeof(int),
trzeci argument to liczba tych integerow, wiec do funkcji powinienes przekazywac rozmiar tablicy jesli nie masz go globalnie dostepnego.

0

dzięki, wszystko się właśnie o sizeof rozbiło.
Moglibyście mi jeszcze jedną rzecz wyjaśnić? W ANSI C Kernighana jest napisane że fopen jeśli jest to możliwe tworzy plik jeśli o podanej nazwie takowy nie istnieje. Od czego zależy czy jest to możliwe?

1

System plików może być tylko do odczytu. Możesz nie mieć uprawnień, żeby wykonać taką operację. Jest pewnie więcej powodów, kiedy jest to niemożliwe.

0

Jak sobie zajrzysz tutaj:

http://man7.org/linux/man-pages/man3/fopen.3.html

to masz tam sekcje "ERRORS "

i tam masz napisane, że w przypadku błędu errno jest ustawione do konkretnej wartości w zależności od tego jaki błąd się pojawił i są to:

  • EINVAL, co oznacza, że "The mode provided to fopen(), fdopen(), or freopen() was invalid", czyli podano niewałściwy argument mode do funkcji
  • "The fopen(), fdopen() and freopen() functions may also fail and set errno for any of the errors specified for the routine malloc(3).", czyli błędy mogą wystąpić takie same jak przy używaniu funkcji malloc tj. "ENOMEM Out of memory" - zabrakło pamięci
  • "The fopen() function may also fail and set errno for any of the errors specified for the routine open(2).", czyli błędy mogą wystąpić takie same jak przy żywaniu funkcji open np. EACCES - wspomniane już wyżej brak praw dostępu do pliku lub ENAMETOOLONG - za długa ścieżka.

i cała lista pozostałych błędów, generalnie chyba jeśli podałeś dobrą ścieżkę i dobry mode, to zazwyczaj problem braku praw dostępu.

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