Sortowanie pliku tekstowego.

2011-10-16 10:21
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?

edytowany 1x, ostatnio: olek1, 2011-10-16 10:22

Pozostało 580 znaków

2011-10-16 12:09
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_kolumnysizeof(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)


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-10-16 12:10

Pozostało 580 znaków

2011-10-16 12:34
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.

Pozostało 580 znaków

2011-10-16 13:16
1

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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-10-16 13:20
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?

edytowany 1x, ostatnio: olek1, 2011-10-16 13:20

Pozostało 580 znaków

2011-10-16 13:43
0

ja bym tych znaków nie wrzucał do tablicy


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-10-16 14:03

Problem został już rozwiązany.

edytowany 6x, ostatnio: olek1, 2011-10-16 18:27

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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