Sortowanie pliku tekstowego.

0

Witam. Piszę program, który ma za zadanie posortować plik tekstowy, w którym znajduje się 30 wierszy po 30 znaków. Ma posortować te wiersze alfabetycznie. Wszystko z dynamiczną alokacją pamięci.

Napisałem coś takiego:

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>

int main(void)
{
	FILE *wsk;
	char **tab;
	char *t;
	char c;
	int i = 0;
	int j = 0;

	if ((wsk = fopen("plik.txt", "r")) == NULL)
		fprintf(stderr, "Blad otwarcia pliku: %s\n", strerror(errno));
	else
	{
		tab = (char**) malloc(30 * sizeof(char*));
		for (i = 0; i < 30; i++)
		{
			*(tab + i) = (char*) malloc(30 * sizeof(char));
		}
		while (((c = fgetc(wsk)) != NULL) && (c != EOF))
		{
			if (c == '\n')
			{
				tab[i][j] = c;
				printf("%c", c);
				i++;
				j = 0;
			}
			else
			{
				tab[i][j] = c;
				printf("%c", c);
				j++;
			}
		}
		if (fclose(wsk) != 0)
		{
			puts("Blad zamkniecia pliku");
			exit(1);
		}
	}
	getchar();
	getchar();
	return 0;
}
 

Ten fragment kodu skopiowałem z jakiejś strony:

		tab = (char**) malloc(30 * sizeof(char*));
		for (i = 0; i < 30; i++)
		{
			*(tab + i) = (char*) malloc(30 * sizeof(char));
		} 

bo nie znalazłem nic ciekawego na necie o przydzielaniu pamięci na tablice dwuwymiarowe. Dlatego też, tego kodu specjalnie nie rozumiem, wiem jednak tyle, że mogę się teraz odwoływać jak do normalnej tablicy np: tab[0][0] = 4;
Jeśli ktoś mógłby polecić mi jakieś źródło gdzie to jest lepiej opisane byłbym wdzięczny.

Wracając do tematu, program nie działa i zaznacz tą linijkę

tab[i][j] = c; 

Moje pytanie dotyczy tego, czy jeśli mam plik tekstowy 30 wierszy po 30 znaków to powinienem alokować tablicę 30x32? Ze znakiem '\n' w 31 komórce i '\0' w 32? Nie wiem też bardzo dlaczego program nie pobiera znaków z pliku i zawiesza się, co robię źle?

1

user image

malloc(n) - alokuje n bajtów w pamięci - malloc zwraca wskaźnik na typ void, zatem należy go rzutować na wskaźnik tego typu co oczekujesz: (typ*)malloc(n)

sizeof(char*) - rozmiar wskaźnika na char

tablica dwuwymiarowa jest to tablica wskaźników na char, zatem należy na te wskaźniki zrobić miejsce w pamięci:
tab = (char**)malloc(szerokosc_tablicysizeof(char));

mamy już miejsce na wskaźniki, ale wskaźniki te są losowymi wartościami. chcemy żeby pokazywały nam adres na blok pamięci w którym jest kolumna.

Jedną kolumnę tworzymy tak:
char* kolumna = (char*)malloc(wyskosc_kolumny*sizeof(char));

a wypełnianie tablicy wskaźników na kolumny będzie wyglądać zatem tak:
for (int i = 0; i<szerokosc_tablicy; i++)
{
tab[i] = (char*)malloc(wyskosc_kolumny*sizeof(char));
}

warto też wspomnieć, że zapis:
cos[i] jest dokładnie tym samym co:
*(cos+i), co oznacza, że zapisy te są dokładnie tym samym:
cos[i]
i[cos]
*(cos+i)

0

Wielkie dzięki za odpowiedź. Jednak nadal nie wiem czemu nie mogę przypisać wartości elementowi tablicy:

tab[i][j] = c; 

Przecież takie coś np. tab[0][0] = 'a';

 już działa.
1

przed while (((c = fgetc(wsk)) != NULL) && (c != EOF))
wstaw i=0;

0
krwq napisał(a)

przed while (((c = fgetc(wsk)) != NULL) && (c != EOF))
wstaw i=0;

Heh, dzięki. Co za głupota. Faktycznie nie zauważyłem, że i używam po inkrementacji do 30. I jeszcze do powyższego pytania, na które nie otrzymałem odpowiedzi:

Jjeśli mam plik tekstowy 30 wierszy po 30 znaków to powinienem alokować tablicę 30x32? Ze znakiem '\n' w 31 komórce i '\0' w 32?

0

ja bym tych znaków nie wrzucał do tablicy

0

Problem został już rozwiązany.

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