-hide-
09-04-2010, 09:53
Ho la necessitā di ordinare un elenco di nomi, formattato in modo particolare (con la tabulazione tra nome e cognome o viceversa), presenti su un file. Il risultato dev'essere riportato su un secondo file.
L'incovazione del programma deve essere seguita da due argomenti, il primo č l'elenco dei nomi esistente ed il secondo quello che deve formarsi.
Ovviamente da qui non vi č niente di impossibile ma si č presentata un'anomalia quando lo stesso proramma č stato fatto girare su Ubuntu del mio amico e sul mio Mac: a lui funziona tutto mentre a me non ordina nulla o quasi.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 20
void sbsort (char **vett, int e);
int main (int argc, char* argv[]) {
unsigned short int ind, i, j, k;
/* Inizio fase di lettura da file */
FILE* fr = fopen (argv[1], "r"); /* Apro il file in lettura */
/* Verifico la corretta apertura del file */
if (fr == NULL) {
printf ("Error: file di lettura non aperto");
exit (1);
}
else printf ("\nLoading...\n");
char* contatti[DIM]; /* Array di Stringhe */
for (i=0; i<DIM; i++) contatti[i] = (char*) malloc (sizeof(char) * 30);
for (ind=0; ((fgets (contatti[ind], DIM-1, fr)) != NULL) && (ind != DIM); ind++);
fclose (fr); /* Chiudo il file precedentemente aperto */
printf("Completato\n");
printf ("\n\tDEBUG 1 - %d nomi presenti su file dopo la lettura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}
sbsort (contatti, ind); /* Ordino array */
/* Inizio fase di scrittuta su file */
FILE* fw = fopen (argv[2], "w"); /* Apro il file di scrittura */
for (j=0; ((fputs (contatti[j], fw)) != EOF) && (j<ind); j++); /* Scrivo sul file */
fclose (fw); /* Chiudo il file di scrittura */
/* Inizio fase di stampa dei contatti a schermo */
printf ("\n\n\tDEBUG 2 - %d nomi presenti su file dopo la scrittura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}
printf ("\n\n");
return 0;
}
/* Funzione che ordina array di stringhe */
void sbsort (char **elenco, int NumeroContatti) {
int i, j;
char *t;
t = (char*) malloc (sizeof(char) * 30); /* Stringa temporanea che conterrā i nomi da sortare */
for (i=0; i<NumeroContatti-1; i++)
for (j=i+1; j<NumeroContatti; j++)
if (strcmp (elenco[i], elenco[j]) == 1) {
strcpy (t, elenco[i]);
strcpy (elenco[i], elenco[j]);
strcpy (elenco[j], t);
}
}
Ed ecco un elenco di nomi:
Pallino Pinco
Rossi Giuseppe
Guglielmo Marconi
Galileo Galilei
Argento Dario
Dog Dylan
Willer Tex
Zanetti Javier
L'incovazione del programma deve essere seguita da due argomenti, il primo č l'elenco dei nomi esistente ed il secondo quello che deve formarsi.
Ovviamente da qui non vi č niente di impossibile ma si č presentata un'anomalia quando lo stesso proramma č stato fatto girare su Ubuntu del mio amico e sul mio Mac: a lui funziona tutto mentre a me non ordina nulla o quasi.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 20
void sbsort (char **vett, int e);
int main (int argc, char* argv[]) {
unsigned short int ind, i, j, k;
/* Inizio fase di lettura da file */
FILE* fr = fopen (argv[1], "r"); /* Apro il file in lettura */
/* Verifico la corretta apertura del file */
if (fr == NULL) {
printf ("Error: file di lettura non aperto");
exit (1);
}
else printf ("\nLoading...\n");
char* contatti[DIM]; /* Array di Stringhe */
for (i=0; i<DIM; i++) contatti[i] = (char*) malloc (sizeof(char) * 30);
for (ind=0; ((fgets (contatti[ind], DIM-1, fr)) != NULL) && (ind != DIM); ind++);
fclose (fr); /* Chiudo il file precedentemente aperto */
printf("Completato\n");
printf ("\n\tDEBUG 1 - %d nomi presenti su file dopo la lettura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}
sbsort (contatti, ind); /* Ordino array */
/* Inizio fase di scrittuta su file */
FILE* fw = fopen (argv[2], "w"); /* Apro il file di scrittura */
for (j=0; ((fputs (contatti[j], fw)) != EOF) && (j<ind); j++); /* Scrivo sul file */
fclose (fw); /* Chiudo il file di scrittura */
/* Inizio fase di stampa dei contatti a schermo */
printf ("\n\n\tDEBUG 2 - %d nomi presenti su file dopo la scrittura\n", ind);
for (k=0; k<ind; k++) {
printf ("\t%s", contatti[k]);
}
printf ("\n\n");
return 0;
}
/* Funzione che ordina array di stringhe */
void sbsort (char **elenco, int NumeroContatti) {
int i, j;
char *t;
t = (char*) malloc (sizeof(char) * 30); /* Stringa temporanea che conterrā i nomi da sortare */
for (i=0; i<NumeroContatti-1; i++)
for (j=i+1; j<NumeroContatti; j++)
if (strcmp (elenco[i], elenco[j]) == 1) {
strcpy (t, elenco[i]);
strcpy (elenco[i], elenco[j]);
strcpy (elenco[j], t);
}
}
Ed ecco un elenco di nomi:
Pallino Pinco
Rossi Giuseppe
Guglielmo Marconi
Galileo Galilei
Argento Dario
Dog Dylan
Willer Tex
Zanetti Javier