Oppure

Loading
18/02/09 17:29
giocala88
Salve ragazzi, ho un piccolo problema con questo semplice programma.
Questo programma funziona così:
si sceglie da un menù se inserire o ricercare delle stringhe. Fermiamoci sul ricercare le stringhe. Allora inserendo la stringa "ciao", il programma dovrà valutare se tale stringa è presente o meno in un file di testo che verrà aperto.
Il problema è che la comparazione tra stringhe, quella inserita dall'utente e quella presuribilmente presente nel file di testo non avviene..dove sbaglio??...grazie a tutti anticipatamente...


Codice in ANSI C:

/*****************************/
/* inclusione delle librerie */
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/******************************/
/* definizioni delle costanti */
/******************************/
#define MAX_CLIENTI 10 /* numero massimo di clienti */

typedef struct
{
char nome_cognome[10];

} Database;


typedef struct
{
Database vett_clienti[MAX_CLIENTI];
int nome_cognomeClienti;

} DatabaseClienti;


void leggi_da_file(DatabaseClienti *dat);

int main()
{
char nome_cognome[10];
int n;
DatabaseClienti database; /* variabile database di tipo struttura */


printf("\n - MENU' DI SCELTA -\n";);
printf("\n [1] Ricerca";);
printf("\n [2] Inserimento\n";);
printf("\n Inserire il numero presente in parentesi per selezionare: ";);
scanf("%d", &n);

printf("\nInserire il nome/cognome da cercare: ";);
scanf("%s", nome_cognome[10]);

if(n = 1)
{
leggi_da_file(&database);
}


return 0;
}

/* definizione della funzione per leggere da file */
void leggi_da_file(DatabaseClienti *dat)
{
FILE *file_clienti;
dat->nome_cognomeClienti = 0; /* variabile di tipo puntatore a struttura inizializzata a zero */
char chiavi_lette[10];
char nome_cognome[10];
int cont, i;

file_clienti = fopen("cliente1.txt", "r);
/*chiavi_lette[10] =*/ fscanf(file_clienti,"%s", dat->vett_clienti[dat->nome_cognomeClienti].nome_cognome);

/* ciclo for */
for (cont = 0; cont < dat->nome_cognomeClienti - 1; cont++)
{
for (i = cont + 1; i < dat->nome_cognomeClienti; i++)
{
if(strcmp(dat->vett_clienti[cont].nome_cognome, nome_cognome) == 0)
printf("Il risultato ha avuto esito positivo";);

else
printf("Il nome '%s' non ha prodotto alcun risultato", nome_cognome[10]);
}
}

/* chiudi i file */
fclose(file_clienti);

}



aaa
18/02/09 19:20
theprogrammer
Intanto queste due righe

scanf("%s", nome_cognome[10]);

if(n = 1)

sono sbagliate perche' dovrebbero essere

scanf("%s", nome_cognome);

if(n == 1)

e infine, la funzione di ricerca non e' corretta ...

Il file non viene letto completamente (c'e' una sola scanf ...) e quindi il ciclo for successivo non puo' trovare nulla ... inoltre non capisco a cosa serva il secondo for ...

Riflettici un attimo ...
aaa
20/02/09 12:11
giocala88
Avevi ragione, ho fatto degli errori che ho revisionato e corretto. Adesso il programma funziona perfettamente ma vorrei capire un'ultima cosa.
Il programma, se selezionata la voce inserisci, chiederà di inserire nome, cognome e scheda.
Il problema è che quando inserisco dei dati nella voce scheda, questa mi ricopia sul file.txt solo la prima voce.
Es
nome: roberto
cognome: rossi
scheda: nato a milano il 24/06/88...
Nella copiatura sul file txt mi ricopia solo la prima voce, cioè nato...come mai?
Potreste dare un'occhiata e consigliarmi come fare a copiare tutto il testo della voce scheda??...grazie anticipatamente...

Codice AnSI C:
/*****************************/
/* inclusione delle librerie */
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/******************************/
/* definizioni delle costanti */
/******************************/
#define MAX_CLIENTI 10 /* numero massimo di clienti */

typedef struct
{
char nome[10],
cognome[10],
scheda[10],
campo_nome[10],
campo_cognome[10],
campo_scheda[10000];

} Database;


typedef struct
{
Database vett_clienti[MAX_CLIENTI];
int nome_cognomeClienti;

} DatabaseClienti;


void leggi_da_file_inserimento(DatabaseClienti *dat);
void leggi_da_file(DatabaseClienti *dat);
int main()
{
char nome_cognome[10],
nome[10],
cognome[10];
int n;
DatabaseClienti database; /* variabile database di tipo struttura */
FILE *file_clienti1,
*file_clienti2,
*file_clienti3,
*file_clienti4,
*file_clienti5,
*file_clienti6,
*file_clienti7,
*file_clienti8,
*file_clienti9,
*file_clienti10;


printf("\n - MENU' DI SCELTA -\n";);
printf("\n [1] Ricerca";);
printf("\n [2] Inserimento\n";);
printf("\n Inserire il numero presente in parentesi per selezionare: ";);
scanf("%d", &n);
int leggi_interno_file;

if(n == 1)
leggi_da_file(&database);

else if(n == 2)
leggi_da_file_inserimento(&database);

return 0;
}

/* definizione della funzione per leggere da file */
void leggi_da_file_inserimento(DatabaseClienti *dat)
{
FILE *file_clienti1,
*file_clienti2,
*file_clienti3,
*file_clienti4,
*file_clienti5,
*file_clienti6,
*file_clienti7,
*file_clienti8,
*file_clienti9,
*file_clienti10;
dat->nome_cognomeClienti = 0; /* variabile di tipo puntatore a struttura inizializzata a zero */
int chiavi_lette;
char nome_cognome[10],
nome[10],
cognome[10],
scheda[10000];

file_clienti1 = fopen("cliente1.txt", "r";);
file_clienti2 = fopen("cliente2.txt", "r";);
file_clienti3 = fopen("cliente3.txt", "r";);
file_clienti4 = fopen("cliente4.txt", "r";);
file_clienti5 = fopen("cliente5.txt", "r";);
file_clienti6 = fopen("cliente6.txt", "r";);
file_clienti7 = fopen("cliente7.txt", "r";);

if(file_clienti1 == NULL)
{
file_clienti1 = fopen("cliente1.txt", "w";);

printf("\n NOME: ";);
scanf("%s", nome);
printf("\n COGNOME: ";);
scanf("%s", cognome);
printf("\n SCHEDA: \n";);
scanf("%s", scheda);

fprintf(file_clienti1, " NOME %5s\n", nome);
fprintf(file_clienti1, " COGNOME %5s\n", cognome);
fprintf(file_clienti1, " SCHEDA:\n%s", scheda);

}
else if(file_clienti2 == NULL)
{
file_clienti2 = fopen("cliente2.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti2, "nome: %5s\n", nome);
fprintf(file_clienti2, "cognome: %5s\n", cognome);
}
else if(file_clienti3 == NULL)
{
file_clienti3 = fopen("cliente3.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti3, "nome: %5s\n", nome);
fprintf(file_clienti3, "cognome: %5s\n", cognome);
}
else if(file_clienti4 == NULL)
{
file_clienti4 = fopen("cliente4.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti4, "nome: %5s\n", nome);
fprintf(file_clienti4, "cognome: %5s\n", cognome);
}
else if(file_clienti5 == NULL)
{
file_clienti5 = fopen("cliente5.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti5, "nome: %5s\n", nome);
fprintf(file_clienti5, "cognome: %5s\n", cognome);
}
else if(file_clienti6 == NULL)
{
file_clienti6 = fopen("cliente6.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti6, "nome: %5s\n", nome);
fprintf(file_clienti6, "cognome: %5s\n", cognome);
}
else if(file_clienti7 == NULL)
{
file_clienti7 = fopen("cliente7.txt", "w";);

printf("\nnome: ";);
scanf("%s", nome);
printf("\ncognome: ";);
scanf("%s", cognome);

fprintf(file_clienti7, "nome: %5s\n", nome);
fprintf(file_clienti7, "cognome: %5s\n", cognome);
}
else
{
printf("\n Database pieno:\n";);
printf("\n Memoria insufficiente per memorizzare altri clienti!\n";);
}

/* chiudi i file */
fclose(file_clienti1);
fclose(file_clienti2);
fclose(file_clienti3);
fclose(file_clienti4);
fclose(file_clienti5);
fclose(file_clienti6);
fclose(file_clienti7);

}


/* definizione della funzione per leggere da file */
void leggi_da_file(DatabaseClienti *dat)
{
FILE *file_clienti1,
*file_clienti2,
*file_clienti3,
*file_clienti4,
*file_clienti5,
*file_clienti6,
*file_clienti7;
dat->nome_cognomeClienti = 0; /* variabile di tipo puntatore a struttura inizializzata a zero */
char nome_cognome[10], modifica;
int cont, chiavi_lette, i;

file_clienti1 = fopen("cliente1.txt", "r";);
file_clienti2 = fopen("cliente2.txt", "r";);
file_clienti3 = fopen("cliente3.txt", "r";);
file_clienti4 = fopen("cliente4.txt", "r";);
file_clienti5 = fopen("cliente5.txt", "r";);
file_clienti6 = fopen("cliente6.txt", "r";);
file_clienti7 = fopen("cliente7.txt", "r";);

printf("\n Inserire il nome/cognome da cercare: ";);
scanf("%s", nome_cognome);

if(file_clienti1 != NULL){
fscanf(file_clienti1,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente1.txt: Nome o cognome presente";);
printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

/* printf("\n Vuoi modificare il documento? [Y/N]\n";);
scanf("%c", &modifica);
if(modifica == 'Y' ||
modifica == 'y')
{
*/
}
else
printf("\n cliente1.txt: Nome o cognome non presente";);
}

if(file_clienti2 != NULL){
fscanf(file_clienti2,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente2.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente2.txt: Nome o cognome non presente";);
}

if(file_clienti3 != NULL){
fscanf(file_clienti3,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente3.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente3.txt: Nome o cognome non presente";);
}

if(file_clienti4 != NULL){
fscanf(file_clienti4,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente4.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente4.txt: Nome o cognome non presente";);
}

if(file_clienti5 != NULL){
fscanf(file_clienti5,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente5.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente5.txt: Nome o cognome non presente";);
}

if(file_clienti6 != NULL){
fscanf(file_clienti6,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente6.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente6.txt: Nome o cognome non presente";);
}

if(file_clienti7 != NULL){
fscanf(file_clienti7,"%s %s %s %s", dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);

if(strcmp(dat->vett_clienti[dat->nome_cognomeClienti].nome, nome_cognome) == 0 ||
strcmp(dat->vett_clienti[dat->nome_cognomeClienti].cognome, nome_cognome) == 0)
{
printf("\n cliente7.txt: Nome o cognome presente";);

printf(" \n %s: %s\n %s: %s\n",dat->vett_clienti[dat->nome_cognomeClienti].campo_nome,
dat->vett_clienti[dat->nome_cognomeClienti].nome,
dat->vett_clienti[dat->nome_cognomeClienti].campo_cognome,
dat->vett_clienti[dat->nome_cognomeClienti].cognome);
}
else
printf("\n cliente7.txt: Nome o cognome non presente";);
}

else if(file_clienti1 == NULL &&
file_clienti2 == NULL &&
file_clienti3 == NULL &&
file_clienti4 == NULL &&
file_clienti5 == NULL &&
file_clienti6 == NULL &&
file_clienti7 == NULL)
printf("\n Database vuoto\n";);


fclose(file_clienti1);
fclose(file_clienti2);
fclose(file_clienti3);
fclose(file_clienti4);
fclose(file_clienti5);
fclose(file_clienti6);
fclose(file_clienti7);

}
aaa
20/02/09 12:45
theprogrammer
Perche' la scanf preleva solo la prima stringa e si ferma allo spazio.

Usa la

fgets

indicando stdin come handle.

P.S. Ma perche' tutti quei file? Addirittura uno per cliente????
aaa
20/02/09 13:40
giocala88
cosa mi consiglieresti, scusa?..grazie

:)
aaa
20/02/09 15:02
giocala88
Scusa ma io non ho capito la fgets...e comunque a me serve leggere da file.. 8-|
aaa
20/02/09 15:13
theprogrammer
Postato originariamente da giocala88:

Scusa ma io non ho capito la fgets...e comunque a me serve leggere da file.. 8-|


Non facciamo confusione ... avevi scritto

"Il programma, se selezionata la voce inserisci, chiederà di inserire nome, cognome e scheda.
Il problema è che quando inserisco dei dati nella voce scheda ..."

e quindi ti riferisci all'inserimento dati da TASTIERA.

E ti ho suggerito di usare la funzione fgets al posto della scanf. Ok?

Per il fatto dei file, non trovo utile inserire ogni record in un file diverso. Dovresti usare UN SOLO FILE in cui inserire i vari nominativi.
aaa
20/02/09 15:23
giocala88
Intendi questo?

if(file_clienti1 == NULL)
{
file_clienti1 = fopen("cliente1.txt", "w";);

printf("\n NOME: ";);
scanf("%s", nome);
printf("\n COGNOME: ";);
scanf("%s", cognome);
printf("\n SCHEDA: \n";);
fgets(handle, 10000, file_clienti1);

fprintf(file_clienti1, " NOME: %5s\n", nome);
fprintf(file_clienti1, " COGNOME: %5s\n", cognome);
fprintf(file_clienti1, " SCHEDA: %s\n", scheda);

}

Scusa ma non riesco a capire bene..così non mi prende niente in input...:-|:-|8-|
aaa