PDA

Visualizza la versione completa : [C++] Scrittura FILE


Salvatore_91
16-02-2009, 15:02
Ciao raga, ho fatto un semplice programma che dovrebbe scrivere su un file, e praticamente lo fa'.
chiedo di inserire il nome, cognome,l'eta', la sezione della classe, e l'anno della classe.
Mi mi stampa i campi relativi a uno sola persona tutti attaccati:
ad esempio:
CarloRusso17A4, anche se ho dichiarato il tracciato record.


# include <stdio.h>
# include <stdlib.h>
# include <string.h>

using namespace std;
typedef char Eta[5]; // qui dichiaro il tracciato record
typedef char Sezione[4]; // qui dichiaro il tracciato record
typedef char Anno[4]; //
typedef char Nome[20]; //

struct alunno {
Nome nome;
Nome cognome;
Eta eta;
Sezione sezione;
Anno anno;
};
struct alunno lettura_stdin();
void scrittura_file(struct alunno a, FILE* w);


int main(){

int ris,n;
struct alunno a[100];
FILE *w, *r;
w = fopen("test_2.txt","w");
ris=0;

while (ris!=3)
{
printf("1) Inserisci l'alunno\n");
printf("2) Immetti a video la lista di alunni\n");
printf("3) Esci\n");
scanf("%d",&ris);

if (ris==1)
{
a[0]=lettura_stdin();
scrittura_file(a[0],w);
}
}
printf ("sei uscito dal programma\n");
fclose(w);
system("pause");
}

struct alunno lettura_stdin(){
struct alunno a;
printf("inserisci il nome dell'alunno\n");
scanf("%s",&a.nome);
printf("inserisci il cognome dell'alunno\n");
scanf("%s",&a.cognome);
printf("inserisci l'eta dell'alunno\n");
scanf("%s",&a.eta);
printf("inserisci la sezione dell'alunno\n");
scanf("%s",&a.sezione);
printf("inserisci l'anno dell'alunno\n");
scanf("%s",&a.anno);
return a;
}
void scrittura_file( struct alunno a, FILE* w){
fprintf(w, "%s",a.nome);
fprintf(w, "%s",a.cognome);
fprintf(w, "%s",a.eta);
fprintf(w, "%s",a.sezione);
fprintf(w, "%s\n",a.anno);
fflush(w);
}

oregon
16-02-2009, 15:34
E qual e' il problema?

Se gli dici di scrivere nel file tutte le informazioni una di seguito all'altra, lui lo fa ...

Salvatore_91
16-02-2009, 15:38
Si, ma avendo dichiarato:


typedef char Eta[5];
typedef char Sezione[4];
typedef char Anno[4];
typedef char Nome[20];

Dovrebbe lasciare spazi vuoti, ad esempio se inserisco il nome: Marco
Dovrebbe scrivere Marco, e poi dovrebbe lasciare 15 spazi vuoti (20-5= 15 , dato che "Nome[20]")??.
Mi sbaglio??

oregon
16-02-2009, 15:41
Ti sbagli.

Una stringa viene scritta fino al NULL. Gli spazi successivi vengono ignorati dalla fprintf

Salvatore_91
16-02-2009, 15:43
ah capito, e come potrei risolverlo??
Ma in un File, mi posso muovore ad esempio come mi muovo sul video usando il Gotoxy().??

oregon
16-02-2009, 15:54
Originariamente inviato da Salvatore_91
ah capito, e come potrei risolverlo??

Usando questo codice



fprintf(w, "%-20s",a.nome);
fprintf(w, "%-20s",a.cognome);
fprintf(w, "%-5s",a.eta);
fprintf(w, "%-4s",a.sezione);
fprintf(w, "%-4s\n",a.anno);


Studia la formattazione dell'output della printf (e della fprintf)


Ma in un File, mi posso muovore ad esempio come mi muovo sul video usando il Gotoxy().??

No ... studia la fseek per capire come muoverti in un file ...

Salvatore_91
16-02-2009, 15:58
ok, grazie mille. :ciauz:

Salvatore_91
16-02-2009, 17:31
Scusami ancora, ho un'altro problema.
Quando creo un nuovo file, cancellando quello precedente, va' tutto bene,
invece quando voglio accodare al file altri "alunni" mi da errore di Windows dopo che ho premuto INVIO per l'ultimo inserimmento (cioe' quando inserisco l'anno e premo invio).


# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
using namespace std;
typedef char Eta[8];
typedef char Sezione[10];
typedef char Anno[8];
typedef char Nome[20];

struct alunno {
Nome nome;
Nome cognome;
Eta eta;
Sezione sezione;
Anno anno;
};
struct alunno lettura_stdin();
void scrittura_file(struct alunno a, FILE* w);

int main(){

int ris;
struct alunno a[100];
FILE *w, *r, *file;

ris=0;

while (ris!=3)
{
printf("1) Accoda l'alunno (Accodando l'alunno agli alunni gia' inseriti\n");
printf("2) Inizia nuovo elenco (Cancellando gli alunni precedenti\n");
printf("3) Esci\n");
scanf("%d",&ris);

if (ris==1)
{
r = fopen("test_2.txt","r");
a[0]=lettura_stdin();
scrittura_file(a[0],w);
}
if (ris==2)
{
w = fopen("test_2.txt","w");
a[0]=lettura_stdin();
scrittura_file(a[0],w);
}
}

printf ("Sei uscito dal programma\n");
fclose(w);
system("pause");
}

struct alunno lettura_stdin(){
struct alunno a;
printf("Inserisci il nome dell'alunno\n");
scanf("%s",&a.nome);
printf("Inserisci il cognome dell'alunno\n");
scanf("%s",&a.cognome);
printf("Inserisci l'eta dell'alunno\n");
scanf("%s",&a.eta);
printf("Inserisci la sezione dell'alunno\n");
scanf("%s",&a.sezione);
printf("Inserisci l'anno dell'alunno\n");
scanf("%s",&a.anno);
return a;
}
void scrittura_file( struct alunno a, FILE* w){
fprintf(w, "%-20s",a.nome);
fprintf(w, "%-20s",a.cognome);
fprintf(w, "%-8s",a.eta);
fprintf(w, "%-10s",a.sezione);
fprintf(w, "%-8s\n",a.anno);
fflush(w);
}

oregon
16-02-2009, 17:34
Se "accodi" al file dei dati, questo non puo' essere aperto in "lettura" ...

r = fopen("test_2.txt","r");

Quando usi delle funzioni che non conosci, prima studiale ...

fopen
http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html

e cerca come si fa un "append" ...

Salvatore_91
16-02-2009, 17:43
Ho messo:


....
FILE *w, *r, *file;
....
....
file = fopen("test_2.txt","a+");
....

ma mi da lo stesso problema

Loading