Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] malloc e lettura di un file

    Premetto che quanto segue lo sto compilando con il vecchio Turbo C++ 3.0

    codice:
    #include <stdio.h>
    #include <mem.h>
    
    void main()
    {
      FILE *fstream;
      int dim_file,x;
      char *my_buffer;
    
    
      if(!(fstream = fopen("prova.txt","rt")))
        printf("Errore in apertura del file.\n");
      else
        printf("File aperto correttamente.\n");
    
      fseek(fstream, 0, SEEK_END);
      dim_file = ftell(fstream);
    
      printf("Il file %c lungo %d caratteri.\n", 138,dim_file);
    
      rewind(fstream);
      my_buffer = (char *) malloc((sizeof(char)*dim_file)+1);
      my_buffer[dim_file] = 0;    
    
      if(fread(my_buffer, sizeof(char), dim_file, fstream) < dim_file)
        printf("Errore nella lettura del file.\n");
      else
        printf("File letto correttamente.\n");
      
      printf("La stringa %c:\n%s\n", 138, my_buffer);  
      
      getch();
    
      fclose(fstream);
      free(my_buffer);
    
      return;
    }
    Praticamente:
    - apro un file di testo
    - ne controllo la lunghezza
    - creo uno spazio in memoria grande quanto il file + un ulteriore byte alla fine.
    - leggo il contenuto del file e lo metto nello spazio creato
    -stampo il file a video

    Ora, nel mio codice ci deve essere qualche problema perchè pur compilandolo senza errori, quando lo avvio la finestra del DOS mi si chiude immediatamente nonostante il getch(), segno che qualcosa manda in tilt l'esecuzione del programma.

    Ho motivo di pensare che il problema stia nell'uso della funzione malloc o nel modo in cui fread riempie lo spazio da essa allocato perchè ho notato che se il file contiene meno di 28 caratteri tutto funziona perfettamente... aggiungo un carattere al file di testo, lo salvo, faccio ripartire il programma e tutto va in tilt come prima

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non mi sembra che ci siano problemi di codice e con Visual Studio funziona regolarmente.

    Penso sia un problema del vecchio Turbo C++ 3.0 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    Ciao, anch'io ho provato il tuo codice, ma con un compilatore Borland, e la fread() mi restituisce un numero di caratteri, o meglio di "items", inferiore al numero effettivo aprendo il file in modalità "text", ma il numero risulta corretto se lo si apre in modalità "binary".

    codice:
    #include <stdio.h>
    #include <malloc.h>
    #include <mem.h>
    
    int main()
    {
    	FILE *fstream;
    	int dim_file, x, items;
    	char *my_buffer;
    
    	fstream = fopen("prova.txt","rb");
    	if(fstream==NULL)
    	{
    		printf("Errore in apertura del file.\n");
    		return -1;
    	}
    	printf("File aperto correttamente.\n");
    
    	fseek(fstream, 0, SEEK_END);
    	dim_file = ftell(fstream);
    	rewind(fstream);
    	
    	my_buffer = (char *) malloc((sizeof(char)*dim_file)+1);
    
    	items = fread(my_buffer, sizeof(char), dim_file, fstream);
    	printf("dimen file = %d\n", dim_file);
    	printf("items read = %d\n", items);
    	if( items < dim_file)
    		printf("Errore nella lettura del file.\n");
    	else
    		printf("File letto correttamente.\n");
      
    	my_buffer[dim_file] = 0;    
    	printf("La stringa %c:\n\"%s\"\n", 138, my_buffer);  
      
    	fclose(fstream);
    	free(my_buffer);
    
    	getchar();
    	return 0;
    }

  4. #4
    Ho risolto in parte il problema. Mi sono accorto che stavo compilando con il modello di memoria LARGE: compilandolo con il modello di memoria di default (che dovrebbe essere lo SMALL per il Turbo c++) tutto funziona perfettamente anche se il file di testo è più lungo di 28 caratteri come dicevo.

    Ora il problema è questo: come dovrei modificare il codice per adattarlo al modello di memoria large? Ho provato a sostituire malloc() con farmalloc(), ma non cambia nulla. La mia conoscenza è limitata in questo ambito..

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se non ricordo male, dovresti usare puntatori far ... qualcosa come

    char far *my_buffer;

    Ma perché non usi un compilatore più moderno?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    EDIT: Ho provato il codice scritto da SamIam e funziona anche con MEMORY LARGE! Ho cercato di capire in cosa era diverso dal mio e, non ci crederete, bastava aggiungere la riga
    codice:
    #include <malloc.h>
    Io pensavo che fosse tutto in mem.h, non sapevo nemmeno che esistesse malloc.h! Eppure il compilatore non mi dava nessun errore. Adesso però vorrei capire perchè fino a 28 caratteri nel file di testo tutto funzionava comunque!

  7. #7
    Originariamente inviato da oregon
    Se non ricordo male, dovresti usare puntatori far ... qualcosa come

    char far *my_buffer;

    Ma perché non usi un compilatore più moderno?
    avevo provato anche ad aggiungere i vari far oltre a farmalloc(), ma non andava comunque. Adesso invece, inserendo quella riga, funziona tutto, anche senza i far.

    Rispondendo alla tua domanda, ho sempre usato il Turbo c++ perchè finora ho sempre lavorato a piccoli programmi DOS, perlopiù giochini che usano la vecchia VGA in 320x200. Penso che per queste cose il Turbo c++ vada più che bene, no?
    In realtà vorrei cominciare a creare anche qualche programma in windows, impararando ad usare le API. Non mi dispiacerebbe trovare un compilatore leggero come il Turbo c++ che mi permettesse di continuare a scrivere programmi DOS e allo stesso tempo fosse in grado anche di compilare programmi Windows che usano le API. Esiste?
    So che esistono piccole varianti nella sintassi a seconda del compilatore. Io preferirei continuare con qualcosa che segua la "sintassi Borland".

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per la questione della malloc, ovviamente avevo provato con quella anche con Visual C++ dato che non esiste la mem.h al di fuori di Borland ...

    Per capire a fondo, bisognerebbe dare un'occhiata al contenuto di mem.h e di malloc.h del tuo compilatore.

    Ma Turbo C++ è veramente un mondo "obsoleto" ...

    Per i sistemi moderni esistono compilatori free come

    Visual C++ Express Edition

    che, ovviamente, sono più "corposi" del vecchissimo Borland, proprio perché sono predisposti per tutto quello che c'è adesso ...

    Ma, secondo me, non puoi rimanere al Turbo C++ ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Adesso ho scoperto che il programma funziona anche se al posto di malloc.h includo stdlib.h. Se non includo nessuna delle due, il programma funziona solo col modello di memoria standard e non con il memory model large. Boh

    Piccolo OT:
    Seguendo il consiglio di oregon sto cominciando ad avvicinarmi a qualcosa di più moderno. Ho installato il compilatore mingw e devo dire che mi sta dando soddisfazioni. Compila sia i miei programmini DOS sia gli esempi dei tutorial sulle API di windows, il tutto senza modifiche, warning o errori. L'unica cosa che non sono ancora riuscito a fargli compilare sono i programmi che contengono riferimenti ai registri del processore e agli interrupt che uso per gestire la VGA nei miei giochini. Per quelli per ora devo continuare con Turbo C++ (credo che dovrei mettermi a modificare il dos.h incluso in mingw che a quanto pare è diverso da quello del turbo c++).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.