Input da tastiera e scrittura su file

di il
6 risposte

Input da tastiera e scrittura su file

Ciao a tutti sono quasi nuovo nel mondo della programmazione e nuovissimo nel mondo del c; per cui potete immaginare quanto sono in difficoltà .. la faccio breve.. questo spezzetone di programma:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define infoesami "/home/alberto/Documenti/Università/Esami.txt"

int main ()
{
int scelta,n;
int exit=1;
typedef struct
{
char *materia;
int esito;
int crediti;
} esami;
esami *vet;
FILE *fptr;
[..........................]
switch (scelta)
{
case 1:
{
printf("\nHai scelto di sovrascrivere il vecchio file. Questo comporta il reinserimento di tutti gli esami!\n");
printf("\nIniziamo! Quanti esami hai dato? ");
scanf("%d", &n);

fptr = fopen(infoesami,"w");
fprintf(fptr,"Materia\t\tEsito\tCrediti\n\n");

vet = (esami*) malloc (n*sizeof(esami));

for (int i=0;i<n;i++)
{
printf("\nEsame n.%d:\n\n",(i+1));
fflush(stdout);
printf("\nMateria?\t"); //IL PROBLEMA E' QUA DA QUALCHE PARTE
fflush(stdout);
scanf("%[^\n]s",vet.materia);
fflush(stdout);
printf("\nEsito?\t");
scanf("%d",&vet.esito);
printf("\nCrediti?\t");
scanf("%d",&vet.crediti);
fprintf(fptr,"%s\t%d\t%d\t\n\n",vet.materia,vet.esito,vet.crediti);
printf("\nEsame n.%d inserito correttamente!\n",(i+1));
}
fclose(fptr);
}
non funziona. mi spiego: premettendo che la compilazione non mi da nemmeno un warning e che programmo con QTCreator in Ubuntu 14.04, quando eseguo va tutto bene fino al punto in cui ho scritto "//IL PROBLEMA E' QUI".. infatti alla domanda "Materia?" il programma non mi fa inserire dati in input e passa direttamente alla domanda dopo. Qualcuno sa dirmi il perché?

grazie mille

6 Risposte

  • Re: Input da tastiera e scrittura su file

    Lascia stare scanf() e utilizza piuttosto fgets() di cui trovi innumerevoli esempi
  • Re: Input da tastiera e scrittura su file

    Non riscivo a farlo funazionare nemmeno con fgets inoltre uso anche Visual Studio 2013 perchè alla fine punterò a fare programmi in ambiente Windows..e in Visual Studio ci sono tutte le menate di scanf_s e tutte quelle funzioni di sicurezza implementate da MS. Quindi, ove possibile, preferirei utilizzare scanf anche su Linux, tanto per abituarmi ad usarlo e incappare negli errori tipici dei neofiti in modo da capire bene. Anche perché sono alla disperata di ricerca di fare errori in modo da capire a fondo il C, ne so poco di programmazione ma so di per certo (qualche amico nel settore) che qunado capisci a fondo il c potenzialmente non hai limiti all'apprendimento di qualsiasi cosa che centri con la programmazione. Con questi presupposti, cerco di non limitarmi a dire "vabbé uso fgets"..preferisco dire"mi faccio una funzione che aiuti a far funzionare come voglio scanf", solo che ho bisogno di aiuto
  • Re: Input da tastiera e scrittura su file

    non riscivo a farlo funazionare nemmeno con fgets
    fgets() richiede un buffer di appoggio, da cui poi estrarre i dati richiesti; è un pò più complicato ma almeno sai quello che sta succedendo.
    n Visual Studio ci sono tutte le menate di scanf_s e tutte quelle funzioni di sicurezza implementate da MS.
    Se usi fgets(), che è sicura, non hai bisogno di altre "menate" come le chiami tu.
    Quindi, ove possibile, preferirei utilizzare scanf anche su Linux, tanto per abituarmi ad usarlo e incappare negli errori tipici dei neofiti in modo da capire bene.
    L'errore tipico è proprio quello di utilizzare scanf()!
    che qunado capisci a fondo il c potenzialmente non hai limiti all'apprendimento di qualsiasi cosa che centri con la programmazione
    Non sono d'accordo; basti solo pensare alla programmazione ad oggetti...
    Con questi presupposti, cerco di non limitarmi a dire "vabbé uso fgets"
    Nessuno ha scritto "vabbè usa fgets": ti è stato consigliato di non utilizzare scanf(), che è una funzione non sicura (infatti mamma ms ne implementa un'alternativa sicura) a favore di fgets() che è sicura. La differenza fra scanf() e fgets() è che in quest'ultima specifichi la dimensione massima del buffer di lettura, evitando così il rischio di buffer overflow (prova a fare qualche ricerca su internet, o anche in questo stesso forum, per capire bene e non affidarti a dicerie).
  • Re: Input da tastiera e scrittura su file

    Accetto volentieri il consiglio, anche se sono da capo perché non usare fgets ma cmq cerco tutto su google, intanto grazie! un altra cosa..sapresti consigliarmi una buona guida pdf anche in inglese che spieghi con qualche esmpio i puntatori e tutto ciò che ne consegue? perché davvero senza una guida adatta sono in difficoltà a capire gli array e le stesse stringhe.. e non riesco nemmeno a capire tutto il giro che ce da fare per l'allocazione dinamnica della memoria.. la so fare ma non mi è ben chiaro come gira il tutto. grazie
  • Re: Input da tastiera e scrittura su file

    Queste cose si studiano SUI LIBRI, non a spizzichi e bocconi spulciando su Internet!
    E i libri SI COMPRANO e si tengono a portata di mano proprio per queste situazioni!

    Guide un par di ciuffoli !!!

    Dove si comprano e quali comprare?
    Una volta, tanto tanto tempo fa, esistevano le librerie (cose strane dette anche negozi) ... poi da posti fisici sono diventati virtuali ...

    Si entrava, e si spulciavano gli scaffali, oppure i cataloghi online ...

    Ma va! Esistono ancora? Incredibile ! ... Non avrei mai pensato ...
  • Re: Input da tastiera e scrittura su file

    Confermo ... lascia stare le "guide" (non si cono guide per ogni minimo argomento) ma affronta lo studio da un libro del linguaggio.

    Avrà sicuramente il capitolo relativo a puntatori, array e stringhe.

    P.S. In realtà internet è piena di informazioni sui "puntatori" per il C e argomenti collegati. Ma nessuna guida o libro ti assicurerà di "capire" le questioni affrontate. Quindi, a prescindere dalla fonte, dovrai dedicare parecchio tempo allo studio teorico e agli esercizi senza pensare che ci siano "scorciatoie magiche".
Devi accedere o registrarti per scrivere nel forum
6 risposte