RISOLTO Dimensione matrice/array di struct [C]

U

Utente 370715

Ospite
Ciao a tutti!
Mi sono cimentato in un'esercitazione dove c'è da leggere un file da linea di comando e poi salvarne il contenuto (si parla di un testo) in un array di strutture oppure in una matrice di caratteri.
Il problema è che del file non conosco il numero di righe, dunque la mia domanda è come posso stabilire la dimensione dell' array di struct o della matrice non conoscendo la dimensione massima
del file?
Non è possibile usare né l'allocazione dinamica (in quanto non è stata spiegata dal prof) né dei contatori per contare le righe e successivamente riportare il puntatore al file indietro con la rewind
o altre funzioni.
 
Ultima modifica da un moderatore:
Soluzione
Il testo esatto dell'esercizio qual è? Perchè dev'esserci qualche scappatoia, altrimenti non si capisce come tu possa leggere un qualcosa la cui dimensione è ignota, senza poter allocare dinamicamente l'array.

Quindi o ti viene detto che puoi smettere di leggere appena l'array si riempie, oppure ti viene detto di usare l'array come buffer circolare, per cui si può, arrivati alla fine dell'array, ricomincerà a riempirlo dalla cima.

Ovviamente i dati sovrascritti dovrebbero essere già stati usati a quel punto, oppure verranno persi per sempre.

E fin qui la parte standard. Standard perchè il C99 supporta gli array a dimensione dinamica, cioè apri il file, lo scorri per trovare il numero di righe ( che memorizzerai in una variabile n ) e...

Edmund Blackadder

Utente Attivo
327
171
così facendo avrei però più array di strutture giusto?
Sì, in pratica ti prepari diversi array di dimensione crescente ed all'occorrenza utilizzi quello che può contenere l'attuale testo. Mi rendo conto che è un approccio poco smart ma senza allocazione dinamica non mi viene in mente altro, l'ideale in questi casi sarebbe una lista concatenata o un array dinamico.
 
U

Utente cancellato 371741

Ospite
se non ti e' stata spiegata/concessa l'allocazione dinamica, e non ti vengono dati dei limiti massimi, neanche della riga, non si potrebbe fare con array statici perche almeno la verifica di non sfondare la devi fare.

Un altra idea,


In Linux

Codice:
fd = open("./tuofile.txt", O_RDWR);

    if (fd == -1)
        errExit("open");

/* size prendi con stat o seek etc */

    addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED)
        errExit("mmap");

Ed ecco che hai il tuo array di char che parte da "addr" con una sola chiamata,

In widnows hai funzioni similari.
 

pabloski

Utente Èlite
2,868
916
Il testo esatto dell'esercizio qual è? Perchè dev'esserci qualche scappatoia, altrimenti non si capisce come tu possa leggere un qualcosa la cui dimensione è ignota, senza poter allocare dinamicamente l'array.

Quindi o ti viene detto che puoi smettere di leggere appena l'array si riempie, oppure ti viene detto di usare l'array come buffer circolare, per cui si può, arrivati alla fine dell'array, ricomincerà a riempirlo dalla cima.

Ovviamente i dati sovrascritti dovrebbero essere già stati usati a quel punto, oppure verranno persi per sempre.

E fin qui la parte standard. Standard perchè il C99 supporta gli array a dimensione dinamica, cioè apri il file, lo scorri per trovare il numero di righe ( che memorizzerai in una variabile n ) e poi puoi definire un'array di dimensione n per contenerle.

Perchè non l'ho citato prima? Perchè nel C11 ( successivo al C99 ) questa funzionalità è diventata opzionale, e quindi non tutti i compilatori C la implementano. Cioè potrebbe benissimo non esistere su certe piattaforme.

Quindi, magari il professore fa riferimento al C99!
 
Soluzione

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!