Macierz, odczyt z pliku *txt

0

Witam,

Otóż mam plik tekstowy, którego struktura wygląda następująco :
5
4 5
7 4

Po pierwszej liczbie następuje przejście do nowej linii, a następne liczby są oddzielone od siebie spacjami. Najpierw chcę odczytać tylko pierwszą liczbę z pliku i umieścić ją w zmiennej a następnie zaalokować dynamicznie tablicę dwuwymiarowa posługując się tą wczytaną liczbą (oznacza rozmiar macierzy). Poniżej funkcja, którą próbuje napisać. Wyrzuca mi dla przykładowej pliku powyżej wartość 53, co jak się domyślam chyba dobrze, oznacza 5 w ASCII. Jak to ugryźć?... Chyba zła droga obrana. Z góry dzięki

int jaki_rozmiar(FILE* plik)
{
    int x;
    char c;

    c = getc(plik);
    /*
    do
    {
        //printf("%c", c);
        c = getc(plik);
    }while(c!='\n');
    */

    return printf("%c",c);
} 
1

A nie możesz użyć fscanf?

0

No ok, zakładam, że mam rozmiar wczytany z pliku do zmiennej. Teraz chcę zaalokować tablicę o tym samym rozmiarze który wczytałem. Do funkcji alokacja_pamięci będę musiał przekazać tylko jeden parametr : rozmiar tak? Nie wiem jak rozwiązać problem z parametrami do usuwania zaalokowanej pamięci w funkcji zwolnienie_pamieci. Co muszę jej przekazać? "Macierz" i rozmiar? Co jest źle w poniższych funkcjach? Jakimi typami będą? Ta pierwsza zwróci nam tablicę "dwuwymiarową" ? Tak?

// ------------ FUNKCJA ALOKUJACA PAMIEC DLA MATRIX -----------
typ alokacja_pamieci(int rozmiar)
{
    double** matrix;
    int i = 0;
    matrix = (double **)malloc(rozmiar*sizeof(double *));
    for(i=0;i<rozmiar;i++)
        {
            matrix[i] = (double *)malloc(rozmiar*sizeof(double));
        }
}
// -------------- FUNKCJA NISZCZACA PAMIEC DLA MATRIX ----------
typ zwolnienie_pamieci( int rozmiar)
{
    int i = 0;
    for(i = 0;i<rozmiar;i++)
        {
            free(matrix[i]);
        }
    free(matrix);
} 
0
// ------------ FUNKCJA ALOKUJACA PAMIEC DLA MATRIX -----------
double** alokacja_pamieci(int rozmiar)
{
    double** matrix;
    int i = 0;
    matrix = (double **)malloc(rozmiar*sizeof(double *));
    for(i=0;i<rozmiar;i++)
        {
            matrix[i] = (double *)malloc(rozmiar*sizeof(double));
        }
    return matrix;
}
// -------------- FUNKCJA NISZCZACA PAMIEC DLA MATRIX ----------
void zwolnienie_pamieci(double** matrix, int rozmiar)
{
    int i = 0;
    for(i = 0;i<rozmiar;i++)
        {
            free(matrix[i]);
        }
    free(matrix);
} 
0

Ok, a więc tak:

Mając zestaw podręcznych "narzędzi" podanych w poniższym kodzie :-) Próbuję wszystko złożyć w sensowną całość.

 // ------------- FUNKCJA OBLICZA ROZMIAR MACIERZY --------------
int jaki_rozmiar(FILE* plik)
{
    int x,asd;
    // Wczytanie pierwszego znaku z pliku, a otrzymać rozmiar macierzy
    fscanf(plik,"%d",&asd);

    return asd;
}
// ------------ FUNKCJA ALOKUJACA PAMIEC DLA MATRIX -----------
double** matrix_alloc(int rozmiar)
{
    double** matrix;
    int i = 0;
    matrix = (double**)malloc(rozmiar*sizeof(double *));
    for(i=1;i<rozmiar;i++)
        {
            matrix[i] = (double*)malloc(rozmiar*sizeof(double));
        }
}
// -------------- FUNKCJA NISZCZACA PAMIEC DLA MATRIX ----------
void zwolnienie_pamieci(double** matrix, int rozmiar)
{
    int i = 0;
    for(i = 0;i<rozmiar;i++)
        {
            free(matrix[i]);
        }
    free(matrix);
}
// ----------------- ZAPELNIANIE TABLICY DYNAMICZNEJ DANYMI Z PLIKU ------
double** macierz_do_tablicy(FILE* plik,double** matrix, int rozmiar)
{
    int iWiersz,iKolumna;
    iWiersz = 0;
    iKolumna = 0;
    for(iWiersz=1;iWiersz<rozmiar;iWiersz++)
    {
        for(iKolumna=0;iKolumna<rozmiar;iKolumna++)
        {
            fscanf(plik, "%f", &matrix[iWiersz][iKolumna]);
            printf("%f", matrix[iWiersz][iKolumna]);
        }
    }
    return matrix;
}
// ------------------ FUNKCJA POKAZUJE MACIERZ -------------------
void pokaz_macierz(double** matrix, int rozmiar)
{
    int iWiersz,iKolumna;
    iWiersz = 0;
    iKolumna = 0;
    for(iWiersz=1;iWiersz<rozmiar;iWiersz++)
    {
        for(iKolumna=0;iKolumna<rozmiar;iKolumna++)
        {
            printf("%f", matrix[iWiersz][iKolumna]);
        }
    }
}

W ramach main() napisałem coś takiego:

 int main()
{
    int alokacja = 0;
    FILE *plik;
    // ---------------------   OPERACJE NA PLIKU ---------------------------------
    if ((plik = fopen("plik.txt", "r")) == NULL) // sprawdzam czy plik poprawnie się otworzył
    {
        printf("Nie moge otworzyć pliku. \n");
    }
    else
    {
    int rozmiar = jaki_rozmiar(plik);
    printf("rozmiar macierzy: %d\n", rozmiar);
    alokacja = matrix_alloc(rozmiar);
    macierz_do_tablicy(plik, alokacja, rozmiar);

    }
    fclose(plik);

I przy wywoływaniu funkcji z parametrami

double** matrix

mam już kłopot. Ten parametr będzie tą dynamiczną tablicą, którą próbuję nieudolnie zaalokować? I jakoś logicznie nie mogę rozgryźć zwracanego typu - double**


 (wskaźnik do wskaźnika), ale to już mniej ważne. :-) Początkujący, także wybaczcie :-(

**EDIT:**
Aha, i jeszcze coś...
Patrząc na strukture pliku w pierwszym poście. Wszelkie operacje na tablicy dwuwymiarowej rozpoczynam od pierwszego wiersza, skoro zerowy jest tylko i wyłącznie dla wczytania rozmiaru przyszłej tablicy. W funkcjach *matrix_alloc, macierz_do_tablicy, pokaz_macierz* w pętlach rozpocząłem od iWiersz = 1. Zagra to tak? Wyedytowałem to w kodzie jakby co.

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