Operazioni sui file in C con più file sorgenti

di il
16 risposte

Operazioni sui file in C con più file sorgenti

Ciao ragazzi!
Questa volta mi trovo a risolvere questo esercizio:

Scrivere un programma in linguaggio C che realizzi la seguente funzione: int** leggiMatrice(char* filename) che, presa in input la stringa che rappresenta il percorso di un file, restituisce la matrice, come array di puntatori, rappresentata nel file. Assumere che la matrice nel file sia rappresentata per righe con gli elementi di ciascuna riga separati da spazi bianchi, e con la PRIMA riga contenente solo le dimensioni della matrice, n° righe e n° colonne
Ad esempio un file con il contenuto seguente:

3 4
2 101 23 4
1 2 3 3
0 0 0 0
rappresenta una matrice 3x4 (elementi della 1° riga)
Non so perché la matrice non venga visualizzata correttamente, nell'anteprima si vede bene. Comunque immaginatela allineata
Verificare la funzione mediante un'opportuna funzione main di prova.


Ho strutturato il mio progetto nel seguente modo:

Il main nel file matrice.c

#include <string.h>
#include <stdio.h>
#include "leggiMatrice.h"
int main()
{
	FILE* pfile = fopen("/home/davide/Scrivania/matrice.txt", "w+");
	leggiMatrice(pfile);

	return 0;
}
Il file per l'intestazione della funzione leggiMatrice.h
int **leggiMatrice(char *filename);
Il file per il corpo della funzione leggiMatrice.c

#include <string.h>
#include <stdio.h>
#include "leggiMatrice.h"

int **leggiMatrice(char *filename)
{

}
Ed infine il makefile:

matrice.o: matrice.c
	gcc -c matrice.c

leggiMatrice.o: leggiMatrice.c
	gcc -c leggiMatrice.c

eseguibile: matrice.o leggiMatrice.o
	gcc -o exe matrice.o leggiMatrice.o

Compilando, mi da questi errori (o meglio warning, tuttavia l'eseguibile me lo crea!!) che non capisco:

make -f makefile.txt eseguibile
gcc -c matrice.c
matrice.c: In function ‘main’:
matrice.c:7:2: warning: passing argument 1 of ‘leggiMatrice’ from incompatible pointer type [enabled by default]
leggiMatrice(pfile);
^
In file included from matrice.c:3:0:
leggiMatrice.h:1:7: note: expected ‘char *’ but argument is of type ‘struct FILE *’
int **leggiMatrice(char *filename);
^
gcc -c leggiMatrice.c
gcc -o exe matrice.o leggiMatrice.o



Grazie

16 Risposte

  • Re: Operazioni sui file in C con più file sorgenti

    Quando hai questo tipo di messaggi, leggili con attenzione. Rileggi parola per parola questa parte

    expected ‘char *’ but argument is of type ‘struct FILE *’

    Ti sta semplicemente dicendo che gli hai detto che passavi un puntatore a "mele" e hai passato un puntatore a "pere".
  • Re: Operazioni sui file in C con più file sorgenti

    Ah capito.. Dunque, il percorso del file lo vede come una STRUCT? Che devo cambiare allora?
  • Re: Operazioni sui file in C con più file sorgenti

    davide.fruci ha scritto:


    Ah capito.. Dunque, il percorso del file lo vede come una STRUCT? Che devo cambiare allora?
    Al contrario lui vuole un char* e tu gli passi qualcosa altro!!!!
  • Re: Operazioni sui file in C con più file sorgenti

    davide.fruci ha scritto:


    Ah capito.. Dunque, il percorso del file lo vede come una STRUCT? Che devo cambiare allora?
    Non mi sembra tu abbia capito.

    Questo

    "/home/davide/Scrivania/matrice.txt"

    è quello che si attende la funzione.
  • Re: Operazioni sui file in C con più file sorgenti

    Ora ho capito!

    Ho cambiato il prototipo della funzione:
    
    int **leggiMatrice(FILE *filename)
    

    Ora, infatti, compilando non mi da errori/warning.

    Anche se, comunque, il prototipo della funzione che dava problemi, in compilazione, me lo forniva l'esercizio stesso del prof. Quindi, è stato lui ad avere una svista!

    Ps: Grazie!
  • Re: Operazioni sui file in C con più file sorgenti

    Mah ... può essere invece che il tuo professore volesse che la funzione accettasse il percorso del file e che la fopen la inserissi nella funzione ...

    Quindi

    leggiMatrice("/home/davide/Scrivania/matrice.txt");

    e nella funzione

    FILE* pfile = fopen(filename, "w+");
  • Re: Operazioni sui file in C con più file sorgenti

    Vero, non ci avevo pensato
  • Re: Operazioni sui file in C con più file sorgenti

    Ragazzi non ho idea di come continuare l'esercizio, è necessario che apra una nuova discussione?
  • Re: Operazioni sui file in C con più file sorgenti

    Mostra il codice attuale e spiega dove incontri problemi.
  • Re: Operazioni sui file in C con più file sorgenti

    In realtà ancora non ho scritto nulla. Il codice è sempre quello che ho postato all'inizio. Ho ragionato su carta al momento.

    Allora, sto ragionando così:

    A - Dato che la funzione deve restituire una matrice, la matrice stessa deve essere dichiarata prima nel main e poi eleborata all'interno di leggiMatrice, corretto?

    B - Nell'esercizio c'è scritto: "...e con la PRIMA riga contenente solo le dimensioni della matrice, n° righe e n° colonne..".
    Dunque, pensavo di prendermi la prima riga del file e di memorizzarla in un array di dimensione 3.
    3 perché quella riga deve contenere nella prima "posizione" il numero di righe della matrice, seguita da uno spazio, e poi da un altro numero contenente il numero delle colonne. Dunque tre elementi.
    Andrei a prendere poi il primo e il terzo elemento di questo array che utilizzerei per poter definire le dimensioni della matrice (tramite una malloc o una calloc?). Però, facendo così, mi troverei in conflitto con il punto A (non posso definirla due volte la matrice!!).

    C - Una volta ottenute le dimensioni della matrice, partendo dalla seconda riga del file, andrei a memorizzare in ogni singolo elemento di tale matrice (compresi gli spazi) tutti gli elementi di ogni riga, tramite un for annidato in un altro for.

    D - Infinire restituire la matrice nel main e stamparla.

    Che ne pensate?

    Se questa soluzione andasse bene, vi chiedo:

    1 - Come prendere la prima riga del file e metterla dentro un array di dimensione 3?
    2 - Come farei a partire dalla seconda riga del file per memorizzare gli elementi dentro la matrice?

    Grazie!
  • Re: Operazioni sui file in C con più file sorgenti

    davide.fruci ha scritto:


    A - Dato che la funzione deve restituire una matrice, la matrice stessa deve essere dichiarata prima nel main e poi eleborata all'interno di leggiMatrice, corretto?
    No. Puoi allocare la matrice dentro la funzione, usarla e restituire il puntatore al main.
    B - Nell'esercizio c'è scritto: "...e con la PRIMA riga contenente solo le dimensioni della matrice, n° righe e n° colonne..".
    Dunque, pensavo di prendermi la prima riga del file e di memorizzarla in un array di dimensione 3.
    3
    Scusa, ma se nella prima riga ci sono le dimensioni, perché parli di 3 x 3?

    Semmai devi leggere quei due valori per eseguire la corretta allocazione della matrice.
    C - Una volta ottenute le dimensioni della matrice...
    ... dopo aver allocato correttamente la matrice, leggerai i valori dal file e li memorizzerai al posto giusto nella matrice.
  • Re: Operazioni sui file in C con più file sorgenti

    Scusa, ma se nella prima riga ci sono le dimensioni, perché parli di 3 x 3?
    Nono. Se vedi ho messo il punto, fine della frase. Dopo il punto ne ho inziata una nuova spiegando perché un array di dimensione 3.

    Comunque, ok. Alloco la matrice dentro la funzione. Intanto come prendere la prima riga del file e metterla dentro un array di dimensione 3?
  • Re: Operazioni sui file in C con più file sorgenti

    No. Per leggere gli array non c'entrano nulla, tanto meno gli spazi.

    Usa la fscanf per leggere il singolo valore. Quindi ti servono due variabili intere, r e c per leggere il primo e il secondo numero.

    Poi una variabile n per leggere i valori delle righe.
  • Re: Operazioni sui file in C con più file sorgenti

    D'accordo. Ma come faccio a far riferimento solo alla prima riga del file? Non c'è un modo per "trasformarla" in un array?
Devi accedere o registrarti per scrivere nel forum
16 risposte