Volevo sapere se era possibile scrivere il contenuto di una struct come nell'esempio, all'interno di un file sotto forma di riga!
se possibile come?
struct scheda
{
char cognome [50];
char nome[50];
char indirizzo[100];
int codice_pers;
};
Volevo sapere se era possibile scrivere il contenuto di una struct come nell'esempio, all'interno di un file sotto forma di riga!
se possibile come?
struct scheda
{
char cognome [50];
char nome[50];
char indirizzo[100];
int codice_pers;
};
codice:#include <stdio.h> struct struttura { char nome[20]; char cognome[20]; } scheda; int main(){ FILE* pf; printf("INSERISCI NOME : "); scanf("%s", scheda.nome); printf("INSERISCI COGNOME: "); scanf("%s", scheda.cognome); pf = fopen("scheda.txt", "w"); fprintf(pf, "%s\n", scheda.nome); fprintf(pf, "%s\n", scheda.cognome); fclose (pf); printf ("RECORD INSERTITO CON SUCCESSO\n"); return 0; }
...Terrible warlords, good warlords, and an english song
questo è il mio completo, va tutto bene fino a quando va a scrivere su file!!!! che mi dice la memoria non poteva essere written...0*000032! Perchè?
#include <stdio.h>
struct struttura
{
char cognome [50];
char nome[50];
char indirizzo[100];
int codice_pers;
} persona;
main ()
{
FILE *fp1;
char ancora;
/*Se il file rubrica.txt non esiste lo crea. */
if ((fp1 =fopen("rubrica.txt", "r")) == NULL)
{
printf("Il file rubrica.dat non esiste e sara' creato\n");
fp1= fopen("rubrica.txt", "w");
}
/* printf("Inserire la posizione\n"); */
/*scanf ("%d", &abbonato.posizione); */
/*Si ripete l'inserimento fino a quando si sceglie di inserire nominativi*/
while (ancora != 'n' && ancora != 'N')
{
printf("Inserire il nome\n");
scanf("%s", persona.nome);
printf("Inserire il cognome\n");
scanf("%s", persona.cognome);
printf("Inserire l'indirizzo\n");
scanf("%s", persona.indirizzo);
printf("Inserire il codice persona\n");
scanf("%s", persona.codice_pers);
fprintf(fp1, "%s\n", persona.nome );
fprintf(fp1, "%s\n", persona.cognome);
fprintf(fp1, "%s\n", persona.indirizzo);
fprintf(fp1, "%s\n", persona.codice_pers);
printf("\nSi desidera aggiungere un altro nominativo?\n");
ancora = '0';
/* Verifico che non vengano immessi altri carateri al di fuori di s,S,n,N */
while (ancora != 's' && ancora !='S' && ancora !='n' && ancora !='N')
{
printf ("Rispondere s/S o n/N\n");
scanf("%s",&ancora);
}
}
/*chiudo il file*/
fclose(fp1);
}
codice:#include <stdio.h> struct struttura { char nome[20]; char cognome [20]; char indirizzo[50]; char codice_pers[10]; } persona; void main () { FILE *fp; char ancora; /*Se il file rubrica.txt non esiste lo crea. */ if (!(fp = fopen("rubrica.txt", "a+"))) printf("Il file rubrica.dat non esisteva ed e\' stato appena creato\n"); /*Si ripete l'inserimento fino a quando si sceglie di inserire nominativi*/ do { printf("Inserire il nome: "); fgets(persona.nome, 50, stdin); printf("Inserire il cognome: "); fgets(persona.cognome, 50, stdin); printf("Inserire l'indirizzo: "); fgets(persona.indirizzo, 50, stdin); printf("Inserire il codice persona: "); fgets(persona.codice_pers, 10, stdin); fprintf(fp, "%s", persona.nome ); fprintf(fp, "%s", persona.cognome); fprintf(fp, "%s", persona.indirizzo); fprintf(fp, "%s", persona.codice_pers); printf("\nSi desidera aggiungere un altro nominativo?\n"); ancora = '0'; /* Verifico che non vengano immessi altri carateri al di fuori di s,S,n,N */ while (ancora != 's' && ancora !='S' && ancora !='n' && ancora !='N') { printf ("Rispondere [S/N]: "); scanf("%c",&ancora); while((getchar()) != '\n'); } } while (ancora != 'n' && ancora != 'N'); /*chiudo il file*/ fclose(fp); }
...Terrible warlords, good warlords, and an english song
è importante che codice_pers sia un int!
codice:#include <stdio.h> struct struttura { char nome[50]; char cognome [50]; char indirizzo[100]; int codice_pers; } persona; void main () { FILE *fp; char ancora; //Se il file rubrica.txt non esiste lo crea. if (!(fp = fopen("rubrica.txt", "a+"))) printf("Il file rubrica.dat non esisteva ed e\' stato appena creato\n"); //Si ripete l'inserimento fino a quando si sceglie di inserire nominativi do { printf("Inserire il nome: "); fgets(persona.nome, 50, stdin); printf("Inserire il cognome: "); fgets(persona.cognome, 50, stdin); printf("Inserire l'indirizzo: "); fgets(persona.indirizzo, 50, stdin); printf("Inserire il codice persona: "); scanf("%d", &persona.codice_pers); fprintf(fp, "%s", persona.nome ); fprintf(fp, "%s", persona.cognome); fprintf(fp, "%s", persona.indirizzo); fprintf(fp, "%d\n", persona.codice_pers); printf("\nSi desidera aggiungere un altro nominativo?\n"); ancora = '0'; // Verifico che non vengano immessi altri carateri al di fuori di s,S,n,N while (ancora != 's' && ancora !='S' && ancora !='n' && ancora !='N') { printf ("Rispondere [S/N]: "); scanf("%c",&ancora); } while((getchar()) != '\n'); } while (ancora != 'n' && ancora != 'N'); //chiudo il file fclose(fp); }
...Terrible warlords, good warlords, and an english song
un ultima cosa, siccome devo fare un ordinamento in base al codice persona all'interno del file, e inoltre dovrò modificare una persona o cancellarla del tutto, mi conviene di più che i dati siano disposti per riga o come nel formato di adesso uno sotto l'altro?
così com'è il file viene creato in questo modo:
luca maria
Marco aurelio
Via caniggia 8
34
ma se volessi una struttura del genere:
luca maria Marco aurelio Via caniggia 8 34
con:
fprintf (pf1, "%s%s%s%d", persona.nome, persona.cognome,
persona.indirizzo, persona.codice_pers);
ma credo che negli array ci siano dei caratteri (tipo '\n') che mi fanno andare a capo lostesso!!!
come posso risolvere questo problema?
Grazie!!!:master:
BASTA TOGLIERE I NEWLINE
codice:#include <stdio.h> struct struttura { char nome[20]; char cognome[20]; char indirizzo[50]; int codice_pers; } persona; void main () { FILE *fp; char ancora; int i; //Se il file rubrica.txt non esiste lo crea. if (!(fp = fopen("rubrica.txt", "a+"))) printf("Il file rubrica.dat non esisteva ed e\' stato appena creato\n"); //Si ripete l'inserimento fino a quando si sceglie di inserire nominativi do { printf("Inserire il nome: "); fgets(persona.nome, 20, stdin); printf("Inserire il cognome: "); fgets(persona.cognome, 20, stdin); printf("Inserire l'indirizzo: "); fgets(persona.indirizzo, 50, stdin); printf("Inserire il codice persona: "); scanf("%d", &persona.codice_pers); for(i=0; i<20; i++){ if(persona.nome[i]=='\n') persona.nome[i]=' '; } for(i=0; i<20; i++){ if(persona.cognome[i]=='\n') persona.cognome[i]=' '; } for(i=0; i<50; i++){ if(persona.indirizzo[i]=='\n') persona.indirizzo[i]=' '; } fprintf(fp, "%s", persona.nome ); fprintf(fp, "%s", persona.cognome); fprintf(fp, "%s", persona.indirizzo); fprintf(fp, "%d\n", persona.codice_pers); printf("\nSi desidera aggiungere un altro nominativo?\n"); ancora = '0'; // Verifico che non vengano immessi altri carateri al di fuori di s,S,n,N while (ancora != 's' && ancora !='S' && ancora !='n' && ancora !='N') { printf ("Rispondere [S/N]: "); scanf("%c",&ancora); } while((getchar()) != '\n'); } while (ancora != 'n' && ancora != 'N'); //chiudo il file fclose(fp); }In genere per queste cose si utilizzano i DATABASE (e non i files di testo)un ultima cosa, siccome devo fare un ordinamento in base al codice persona all'interno del file, e inoltre dovrò modificare una persona o cancellarla del tutto, mi conviene di più che i dati siano disposti per riga o come nel formato di adesso uno sotto l'altro?
http://forum.html.it/forum/showthrea...62#post2943162
CMQ, a scopo puramente didattico... credo che la "cosa"
in generale la gestisci meglio inserendo i campi (nome, cognome, ecc...) come nel primo esempio (uno per riga)
anche se forse per cancellare un intero RECORD è meglio
inserire in ogni riga un singolo record (come nel secondo esempio).
...Terrible warlords, good warlords, and an english song
Secondo me fai prima ad usare fread e fwrite.
Così usi una sola riga di codice per leggere/scrivere un'intera struct!