Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
bella strana come cosa...
non potresti postare un po più di codice per aiutare a capire meglio il flusso di programma?
qui ci sono in gioco puntatori.... potrebbe anche essere che l'errore è sperduto da qualche altra parte
ti sei scordato molto probabilmente di passare l'indirizzo della variabile car:
se car è di tipo char tu usi
fscanf(fptr,"%s",car);
ma devi usare
fscanf(fptr,"%s",&car);
se car è un array può darsi che non sia di dimensione giusta...: quando allochi l'altra variabile? subito dopo car o subito prima? ti sei ricordato che un array di caratteri deve avere n+1 elementi dove n è la lunghezza della stringa e il +1 serve per lo zero terminale?
la sparo li come una stronzata, perché forse &num_stud contiene un indirizzo e non un valore e ka conseguenza ad un'errata sintassi e' che punti al nulla / void / 0 a causa del casting?!
putroppo non mastico programmazzione di c/c++ dall'esame di programmazione 2 e sono passati diversi anni
fptr=fopen(filename,"r");
int num_stud;
char car[9];
while(!feof(fptr)){
fscanf(fptr,"%d",&num_stud);
fscanf(fptr,"%s",car);
}
Il file studenti.txt contiene informazioni così strutturate:
139 (13/03), 200 (29/06)
Quindi leggo prima il numero, eppoi metto il resto in una stringa di dimensione +1 per contenere il terminatore.La lettura successiva di car, perchè dovrebbe danneggiare la precedente?Il file pointer non viene incrementato da una fscanf?Ovviamente il problema è risolvibile, ma non capisco questo comportamento.
Per quanto ne so la feof per stabilire se ha trovato la fine del file deve basarsi sull'ultima fscanf, quindi il tuo codice è errato nella gestione del ciclo while.
fptr=fopen(filename,"r");
int num_stud;
char car[9];
while(!feof(fptr)){
fscanf(fptr,"%d",&num_stud);
fscanf(fptr,"%s",car);
}
Il file studenti.txt contiene informazioni così strutturate:
139 (13/03), 200 (29/06)
Quindi leggo prima il numero, eppoi metto il resto in una stringa di dimensione +1 per contenere il terminatore.La lettura successiva di car, perchè dovrebbe danneggiare la precedente?Il file pointer non viene incrementato da una fscanf?Ovviamente il problema è risolvibile, ma non capisco questo comportamento.
Non uso c da un po' ma se non sbaglio il tuo errore sta nel fatto che la fscanf acquisice tutta la figa in colpo solo, mentre tu cerchi di leggere 1 riga con 2 fscanf separate.
Quello che succede con il tuo codice è che(supponendo il file non vuoto):
Al primo ciclo leggi il numero, lo metti in "num_stud" e perdi il resto della stringa, la seconda fscanf invece legge tutta la seconda riga del file "fottendoti" anche il numero e lasciandoti "num_stud" con lo zero di fine riga.
fptr=fopen(filename,"r");
int num_stud;
char car[9];
while(!feof(fptr)){
fscanf(fptr,"%d",&num_stud);
fscanf(fptr,"%s",car);
}
Il file studenti.txt contiene informazioni così strutturate:
139 (13/03), 200 (29/06)
Quindi leggo prima il numero, eppoi metto il resto in una stringa di dimensione +1 per contenere il terminatore.La lettura successiva di car, perchè dovrebbe danneggiare la precedente?Il file pointer non viene incrementato da una fscanf?Ovviamente il problema è risolvibile, ma non capisco questo comportamento.
Non uso c da un po' ma se non sbaglio il tuo errore sta nel fatto che la fscanf acquisice tutta la figa in colpo solo, mentre tu cerchi di leggere 1 riga con 2 fscanf separate.
Quello che succede con il tuo codice è che(supponendo il file non vuoto):
Al primo ciclo leggi il numero, lo metti in "num_stud" e perdi il resto della stringa, la seconda fscanf invece legge tutta la seconda riga del file "fottendoti" anche il numero e lasciandoti "num_stud" con lo zero di fine riga.
Ciao
FE
Concordo al 100%, se vuoi leggere in due passi, devi usare rewind(3) e co.
Quello che succede con il tuo codice è che(supponendo il file non vuoto):
Al primo ciclo leggi il numero, lo metti in "num_stud" e perdi il resto della stringa, la seconda fscanf invece legge tutta la seconda riga del file "fottendoti" anche il numero e lasciandoti "num_stud" con lo zero di fine riga.
Scusa ma come fa a "fottermi" il numero???é in una variabile ormai!Perchè dovrebbe sovrascriverlo?Eppoi la fscanf è come la scanf, solo che lo stream di input è un file e non stdin..Quindi quando trova uno spazio o \n si ferma..
afterjames ha scritto:
Scusa ma come fa a "fottermi" il numero???é in una variabile ormai!Perchè dovrebbe sovrascriverlo?Eppoi la fscanf è come la scanf, solo che lo stream di input è un file e non stdin..Quindi quando trova uno spazio o \n si ferma..
Ok. Fortuna che ho detto che non ricordavo. Hai ragione, la scanf si ferma al primo spazio che incontra. Il discorso di fotterti il num era riferito al ciclo(ma è un altro discorso dato che la fscanf non legge tutta la riga).
Non so che dirti, ho provato il tuo codice, sul mio pc funziona bene. In num_stud ci va zero solo se faccio la stringa di 8. Con 9 va benissimo.
Quello che succede con il tuo codice è che(supponendo il file non vuoto):
Al primo ciclo leggi il numero, lo metti in "num_stud" e perdi il resto della stringa, la seconda fscanf invece legge tutta la seconda riga del file "fottendoti" anche il numero e lasciandoti "num_stud" con lo zero di fine riga.
Scusa ma come fa a "fottermi" il numero???é in una variabile ormai!Perchè dovrebbe sovrascriverlo?Eppoi la fscanf è come la scanf, solo che lo stream di input è un file e non stdin..Quindi quando trova uno spazio o \n si ferma..
Il secondo fscanf usa car, definito car[9], 8 caratteri + \0
studenti.txt contiene 24 chars + \n
ai tempi passati dava un "core dumped"
Non mi e' mai piaciuta, la fscanf().
Io uso fgets(), oppure fread() se ho un file binario, e poi mi faccio il parsing della riga letta. Se trova qualcosa di inaspettato (e nel mondo reale succede piu' spesso di quanto pensi ) non pianto niente.
robbybby ha scritto:Non mi e' mai piaciuta, la fscanf().
Io uso fgets(), oppure fread() se ho un file binario, e poi mi faccio il parsing della riga letta. Se trova qualcosa di inaspettato (e nel mondo reale succede piu' spesso di quanto pensi ) non pianto niente.