|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
[C] HELP problema lettura file
devo fare, per esercizio, un programma che :
*legga da un file txt il cognome e la matricola di alcuni studenti *legga da un secondo file la matricola, voto 1 e voto2 *scriva su un terzo file cognome, matricola e media dei voti. questo è quello che ho fatto, qualcuno mi da una mano a capire perchè non gira? (Chiedo scusa per eventuali errori da spina, ho cominciato a programmare due settimane fa..) #include <stdio.h> #include <stdlib.h> #include <string.h> //definisco costanti #define FAILURE 1 #define SUCCESS 0 #define LNOME 21 #define LMATRICOLA 7 #define LMAX 50 typedef struct STUDENTI{ char cognome[LNOME]; char matricola[LMATRICOLA]; int votofinale; }STUDENTI; //prototipi FILE *leggoeapro(char *nome, char *access); int scrivofile(FILE *fp, STUDENTI vet[], int n); int main(void){ FILE *fp; char nome[10], end, nm; STUDENTI vet[LMAX]; int n1, i, j, v1, v2, k; fp=leggoeapro(nome, "r"); fscanf(fp, "%d",&n1); i=0; while (fscanf(fp,"%s%s",vet[i].cognome, vet[i].matricola)!=EOF){ printf("%s\t%s\n",vet[i].cognome, vet[i].matricola); i++; } fclose(fp); fp=leggoeapro(nome, "r"); while (fscanf(fp, "%s %d %d", nm, &v1, &v2)!=EOF){ for (k=0;k<=i;k++){ if (strcmp(vet[k].matricola,nm)==0){ if(v1!=30 && v2!=30){ vet[k].votofinale=((v1+v2)/2); }else{ vet[k].votofinale=31; } if(vet[k].votofinale<18){ vet[k].votofinale='ins'; }else{ vet[k].votofinale='ND'; } } } } fclose(fp); fp=leggoeapro(nome,"w"); for(k=0;k<=i;k++){ fprintf(fp,"%s %s %d",vet[k].cognome, vet[k].matricola, vet[k].votofinale); } scanf("%s",end); return(SUCCESS); } //Legge il nome di un file e me lo apre //mi ritorna un file pointer, e mi dice se il file esiste. FILE *leggoeapro (char *nome, char *access) { FILE *fp = NULL; printf ("Nome file: "); scanf ("%s", nome); fp = fopen (nome, access); if (fp == NULL) { fprintf (stderr, "\nErrore apertura file.\n"); } return (fp); } Grazie a tutti quelli che con pazienza mi potranno aiutare ![]()
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() Ultima modifica di kobane : 09-06-2005 alle 17:12. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
testo dell'esercizio
Esercizio 1
----------- Realizzare un programma C che effettui le seguenti operazioni: * legga un primo file avente il seguente formato: * la prima riga indica il numero di righe successive (al massimo 50) * ciascuna delle righe successive ha il seguente formato: <cognome> <numero_di_matricola> In cui: * <cognome> e` costituito da un massimo di 20 caratteri alfabetici * <numero_di_matricola> da un massimo 6 caratteri alfabetici e numerici. Nessun campo contiene degli spazi e i campi sono separati da uno spazio singolo. * legga un secondo file avente al massimo lo stesso numero di righe del primo file e avente il seguente formato: <numero_di_matricola> <voto_scritto> <voto_orale> In cui: * <numero_di_matricola> ha il formato precedentemente indicato * il <voto_scritto> e il <voto_orale> sono numeri interi compresi tra 1 e 30. * stampi su un terzo file, per ciascun studente, le informazionei seguenti: <numero_di_matricola> <cognome> <voto_finale> in cui il <voto_finale> e` la media aritmetica di <voto_scritto> e <voto_orale>. Si noti inoltre quanto segue: * il secondo file non contiene informazioni su studenti NON presenti nel primo file * se uno studente presente nel primo file non compare nel secondo, si indichi N/A in luogo del voto * il <voto_finale> va approssimato per eccesso all'intero superiore (e.g., (18+21)/2 = 19.5 -> 20). * se il <voto_finale> e` inferiore a 18 si stampi INSUF * se lo studente ha conseguito due 30 si stampi 30Lode. * i nomi dei tre file vanno letti da tastiera Osservazioni ------------ L'esercizio va risolto utilizzando un SOLO vettore di strutture. La struttura conterra' campi per memorizzare il <cognome>, il <numero_di_matricola> e il <voto_finale>. Si noti che NON e' necessario memorizzare completamente in memoria centrale anche il contenuto del secondo file.
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
app
![]()
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() |
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
indentalo altrimenti non ci si capisce nulla e nessuno ti risponderà..basta che copi il codice correttamente indentato tra il tag [ code ] e il tag [ /code ]
senza spazi |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
che truccone!!
![]() Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> //definisco costanti #define FAILURE 1 #define SUCCESS 0 #define LNOME 21 #define LMATRICOLA 7 #define LMAX 50 typedef struct STUDENTI{ char cognome[LNOME]; char matricola[LMATRICOLA]; int votofinale; }STUDENTI; //prototipi FILE *leggoeapro(char *nome, char *access); int scrivofile(FILE *fp, STUDENTI vet[], int n); int main(void){ FILE *fp; char nome[10], end, nm; STUDENTI vet[LMAX]; int n1, i, j, v1, v2, k; fp=leggoeapro(nome, "r"); fscanf(fp, "%d",&n1); i=0; while (fscanf(fp,"%s%s",vet[i].cognome, vet[i].matricola)!=EOF){ printf("%s\t%s\n",vet[i].cognome, vet[i].matricola); i++; } fclose(fp); fp=leggoeapro(nome, "r"); while (fscanf(fp, "%s %d %d", nm, &v1, &v2)!=EOF){ for (k=0;k<=i;k++){ if (strcmp(vet[k].matricola,nm)==0){ if(v1!=30 && v2!=30){ vet[k].votofinale=((v1+v2)/2); }else{ vet[k].votofinale=31; } if(vet[k].votofinale<18){ vet[k].votofinale='ins'; }else{ vet[k].votofinale='ND'; } } } } fclose(fp); fp=leggoeapro(nome,"w"); for(k=0;k<=i;k++){ fprintf(fp,"%s %s %d",vet[k].cognome, vet[k].matricola, vet[k].votofinale); } scanf("%s",end); return(SUCCESS); } //Legge il nome di un file e me lo apre //mi ritorna un file pointer, e mi dice se il file esiste. FILE *leggoeapro (char *nome, char *access) { FILE *fp = NULL; printf ("Nome file: "); scanf ("%s", nome); fp = fopen (nome, access); if (fp == NULL) { fprintf (stderr, "\nErrore apertura file.\n"); } return (fp); }
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
up
![]()
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2004
Città: Torino
Messaggi: 1443
|
o, non riesco a capire l'errore... possibile che io si a così spina?
![]()
__________________
La terra è di destra, l'universo di sinistra - Chuck Norris fan ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:22.