[C] consigli algoritmo
Ringrazio chi avrà la pazienza di rispondermi
Devo scrivere un programma che
-crei un file contenente un vettore di strutture (ogni struttura deve contenere due campi di tipo stringa con dimensioni prefissate: nome e età);
-ricerchi sul file e visualizzi su standard output i campi della i-esima struttura(record), dove i è un parametro definito dall'utente come argomento di invocazione del programma.
Fin'ora ho abbozzato la parte di scrittura del vettore su file,ma credo di aver sbagliato tante cose,in primis l'impostazione.
Cioè non so se l'algoritmo di creare prima il vettore all'interno del programma e poi scriverlo su file sia giusto...
Inoltre mi da errore nel modo in cui scrivo sul vettore (e non capisco il perché,in teoria dovrebbe essere così).
avete altri consigli/correzioni in merito?
Come potrei procedere con le altre richieste della traccia?Ad esempio non ho idea di come poter poi leggere le informazioni da file usando la funzione read

Devo scrivere un programma che
-crei un file contenente un vettore di strutture (ogni struttura deve contenere due campi di tipo stringa con dimensioni prefissate: nome e età);
-ricerchi sul file e visualizzi su standard output i campi della i-esima struttura(record), dove i è un parametro definito dall'utente come argomento di invocazione del programma.
Fin'ora ho abbozzato la parte di scrittura del vettore su file,ma credo di aver sbagliato tante cose,in primis l'impostazione.
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> # define N 5 # define dim 15 int file,i; struct persona { char nome[dim]; char eta[dim]; }; struct persona vect[N]; int main(int argc, char* argv[]) { if (argc!=2) printf ("Uso:%s <indice vettore> ",argv[0]); if((file = creat ("file.dat", O_RDWR)) < 0) { fprintf(stderr, "File non accessibile : %s\n",strerror(errno)); exit(-1); } for (i=0; i<N ; i++) { vect[i].nome = "a"+i; //per scrivere delle stringhe diverse a caso... vect[i].eta = "1"+1; //idem } for (i=0; i<N; i++) { s1=strlen(vect[i].nome); s2=strlen(vect[i].eta); write("file.dat" , vect[i].nome ,s1 ); write("file.dat" , vect[i].eta , s2 ); } }
Cioè non so se l'algoritmo di creare prima il vettore all'interno del programma e poi scriverlo su file sia giusto...
Inoltre mi da errore nel modo in cui scrivo sul vettore (e non capisco il perché,in teoria dovrebbe essere così).
avete altri consigli/correzioni in merito?
Come potrei procedere con le altre richieste della traccia?Ad esempio non ho idea di come poter poi leggere le informazioni da file usando la funzione read
Risposte
Che cosa dovrebbe fare il seguente codice?
Siccome l'espressione "a" ha tipo const char * e quindi stai sommando un puntatore con una stringa ottenendo un puntatore spostato di un certo numero di posizioni rispetto a quello originale. È insomma equivalente a
che a dire il vero mi stupisce venga compilato correttamente.
vect[i].nome = "a"+i; //per scrivere delle stringhe diverse a caso...
Siccome l'espressione "a" ha tipo const char * e quindi stai sommando un puntatore con una stringa ottenendo un puntatore spostato di un certo numero di posizioni rispetto a quello originale. È insomma equivalente a
vect[i].nome = &( "a"[i] );
che a dire il vero mi stupisce venga compilato correttamente.
"apatriarca":
Che cosa dovrebbe fare il seguente codice?
vect[i].nome = "a"+i; //per scrivere delle stringhe diverse a caso...
Beh,diciamo che l'idea era quella di riempire il vettore con cose a casaccio(certo avevo intenzione che fossero stringhe)
Immagine che tu volessi fare qualcosa come il seguente:
sprintf(vect[i].nome, "a%d", i);
Si ok.Immagino che ci sia anche una funzione fscanf che potrò poi utilizzare nella fase di lettura?
Considerando che le strutture sono di dimensione fissa è più facile usare fread.. Ma tu stai usando le funzioni POSIX per accedere al file che io non conosco..
Si effettivamente il contesto dell'esercizio era quello dell'esercitarsi con le funzioni open,creat,read e write...
E quindi allora devi usare read.. Nota che siccome le strutture hanno una dimensione nota, quella i-esima si troverà ad una posizione fissa nel file.