n° 174
Maggio 2012
Maggio 18, 2012, 05:58:48 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Problema apertura file da programma C  (Letto 288 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
StefanoMDj
Newbie
*

Karma: +0/-2
Scollegato Scollegato

Messaggi: 10


Mostra profilo E-mail
« inserita:: Febbraio 03, 2012, 06:46:01 pm »

Salve ragazzi, ho creato due programmi in C, uno che crea un file di nome "interi" in cui sono presenti 10 interi e uno con nome "binari" in cui sono presenti 10 binari.
ora dovrei creare un programma che li apre e li controlla a coppie e stabilisce se sono uguali o no...solo che quando vado ad inserire il fread o fscanf non riesce a leggere i file anche se il nome è giusto....come mai?

Codice:
int binario;
int intero;


void main () {
     
printf ("questo programma analizza i due numeri e vedono se coincidono\n");

fpinteri=fopen(interi,"r");
fpbinari=fopen(binari,"rb");

while (fpbinari!=EOF || fpinteri!=EOF) {

fread (&binario,sizeof(int),1,fpbinari);
fscanf (fpinteri, "%d", &intero);

if (intero==binario) printf ("sono uguali");
else printf ("non sono uguali"); }

system ("pause"); }
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +175/-11
Scollegato Scollegato

Messaggi: 2515


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #1 inserita:: Febbraio 03, 2012, 07:07:24 pm »

Il sorgente proposto contiene una silloge di errori di varia gravità. L'errore più esiziale consiste senz'altro nell'uso di dev-c, un ambiente totalmente deprecato il cui utilizzo è, a tutt'oggi, assolutamente ingiustificato - anche e soprattutto in ambito didattico. L'altra conseguente bestemmia è l'uso del demenziale idioma "system("pause")", ossia la smobilitazione di un cacciatorpediniere con cannoni da 155 per abbattere un paio di tordi.

Assumendo comunque che tu non abbia potere decisionale al riguardo, rimangono gli altri errori ed omissioni.
 
In primis, non è specificato il contenuto delle variabili "interi" e "binari" che compaiono nelle fopen(). A rigore dovrebbe trattarsi di array di caratteri, null-terminated, ma ciò non risulta dal sorgente riportato.

Secondariamente, non viene controllato che il relativo puntatore restituito dalle fopen() sia effettivamente diverso da NULL.
Codice:
    fp = fopen(filename, mode);
    if (NULL == fp)
    {
        fprintf(stderr, "Errore durante l'apertura del file %s!\n\n", filename);
        return(1);
    }

Terzo, la condizione di permanenza nella while è errata per due motivi. L'espressione usata non ha senso in C (si compara un puntatore di tipo FILE* ad una costante EOF), e in ogni caso con quella forma si deve usare un AND tra le due condizioni, per il teorema di De Morgan.

Quarto, void main() è sbagliatissimo.

Questo ad una prima occhiata...
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
StefanoMDj
Newbie
*

Karma: +0/-2
Scollegato Scollegato

Messaggi: 10


Mostra profilo E-mail
« Risposta #2 inserita:: Febbraio 04, 2012, 12:13:09 pm »

Guarda per l'ambiente di sviluppo ci han consigliato questo e system("pause") è il modo più semplice di fermare il programma...altrimenti dovrei mettere un getchar()....
Comunque binari e interi erano i nomi dei due file che erano presenti nella cartella, ma andavano inseriti tra virgolette "interi.txt" ecc..
nel while in effetti è vero, ho cambiato la condizione con while (!(feof(fpbinari) || feof(fpinteri))) e funziona!

Una cosa...non capisco coma mai void main sia sbagliato! alla fine non è una funzione con un valore di ritorno Sorriso!

Chiedo scusa se faccio/dico cavolate ma è da 4-5 mesi che ho iniziato programmazione all'università e sto studiando ora per l'esame!
Registrato
IndieAlex
Full Member
***

Karma: +13/-1
Scollegato Scollegato

Messaggi: 349

0
Mostra profilo
« Risposta #3 inserita:: Febbraio 04, 2012, 12:33:07 pm »

per quanto riguarda system("PAUSE");

http://www.gidnetwork.com/b-61.html
Citazione
-    It's not portable. This works only on systems that have the PAUSE command at the system level, like DOS or Windows. But not Linux and most others...

-    It's a very expensive and resource heavy function call. It's like using a bulldozer to open your front door. It works, but the key is cleaner, easier, cheaper. What system() does is:

        1. suspend your program

        2. call the operating system

        3. open an operating system shell (relaunches the O/S in a sub-process)

        4. the O/S must now find the PAUSE command

        5. allocate the memory to execute the command

        6. execute the command and wait for a keystroke

        7. deallocate the memory

        8. exit the OS

        9. resume your program

There are much cleaner ways included in the language itself that make all this unnessesary.
You must include a header you probably don't need: stdlib.h or cstdlib.
It's a bad habit you'll have to break eventually anyway.

Instead, use the functions that are defined natively in C/C++ already. So what is it you're trying to do? Wait for a key to be pressed? Fine -- that's called input. So in C, use getchar() instead. In C++, how about cin.get()? All you have to do is press RETURN and your program continues.

per quanto riguarda dev-c++, se non ti hanno obbligato (ma solo consigliato) a usarlo, cambialo.
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +39/-1
Scollegato Scollegato

Messaggi: 1959



Mostra profilo WWW
« Risposta #4 inserita:: Febbraio 04, 2012, 12:39:13 pm »

Citazione
Guarda per l'ambiente di sviluppo ci han consigliato questo

Vi han consigliato male! (come ha già riportato MAW, leggi qui per sapere perché).

Citazione
e system("pause") è il modo più semplice di fermare il programma...
Per niente! E' non standard, non portabile, inutile, e ti conviene spendere un paio di minuti a leggere bene qui tutto il resto. (Non si vede perché getchar() debba essere più complicato).

Citazione
alla fine non è una funzione con un valore di ritorno
E invece sì, anche se potrebbe non essere ovvio.

Il tuo programma deve restituire un valore al sistema operativo, per indicare se è andato tutto bene o si è verificato un errore. Se non scrivi esplicitamente un'istruzione return, il compilatore restituisce 0 (che indica un'esecuzione andata a buon fine). Pertanto void main è nonstandard è sbagliato, e qualsiasi compilatore decente dovrebbe almeno segnalarlo, se non rifiutarsi di compilare il programma (per approfondimenti vedi questo sempiterno thread).

PS: Nel frattempo IndieAlex ha postato qualcosa di molto simile... lascio comunque quest'intervento: repetita juvant!
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page