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

    [C++] leggere file testuali

    Sìsì, so che l'argomento è stato già affrontato svariate volte,
    ma vi chiedo di aiutarmi a correggere il mio codice per migliorare nel c++.
    Con questa funzione dovrei leggere la prima linea di testo da un file txt

    codice:
    char* FileTextReadFirstLine(FILE* file)
    {
    	char byte;
    	int i = 0;
            //con il prossimo loop salvo in i la lunghezza 
            //della prima linea nel file txt
    	while(!feof(file)) {
    		//Leggo un char dal file
    		fread(&byte,sizeof(char),1,file);
    		if(byte==13) break;
    		i++;
    	}
    	//Fino a qui il codice funziona, ritorna correttamente la lunghezza della prima linea.
            //Adesso posso creare il mio array di char da riempire, rileggendo il file.
    	char* line = (char*) malloc(sizeof(char)*(i+1));
            //i+1 per il null terminated char.
            //Prima risetto a 0 la posizione nel file
            fseek(file,0,SEEK_SET);
    	int a;
    	for(a=0;a<=i;a++) {
    		fread(line+a,sizeof(char),1,file);
    	}
    	*(line+a) = '/n'; //null-termino l'array
    	return(line);
    }
    In seguito, con cout << line; scopro che line è stata riempita di byte strani!
    che errore ho fatto?

  2. #2
    dopo diversi tentativi ho scoperto che ho sbagliato qualcosa nel terminare la stringa, perchè sizeof(ritorno_di_funzione) mi da 24 invece di 11! (provato con un file txt), eppure boh.. mi sembra giusto..

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A parte che qui di C++ non c'è niente. Questa linea:
    codice:
    *(line+a) = '/n'; //null-termino l'array
    è sbagliata ( e il compilatore dovrebbe dare almeno uno warning dato che sono due caratteri, non uno).
    Dev'essere:
    codice:
    *(line+a) = NULL; //null-termino l'array
    In generale, però, l'intero impianto mi sembra
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    codice:
    char* FileTextReadLine(FILE* file)
    {
    	unsigned char byte;
    	int i = 0; char* line = new char;
    	while(true) {
    		if(feof(file)) return(NULL);
    		fread(&byte,sizeof(unsigned char),1,file);
    		if(byte==13) break;
    		line[i++] = byte;
    		char* newb = new char;
    		memcpy(&line[i],newb,sizeof(newb));
    		delete newb;
    		line[i] = NULL;
    	}
    	return(line);
    }
    Grazie, mo funziona.
    L'intero impianto ti fa paiura perchè si tratta di allocazione di memoria dinamica, senza che poi venga liberata a fine funzione?
    In quale altro modo potrei fare per creare un array dinamico di char?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Adesso che l'hai sistemata fa un po' meno
    Però ci sono ancora cose che non vanno.
    line è un puntatore a un singolo char non a un array di char, quindi usarlo con le [] è sbagliato.
    Questa istruzione:
    codice:
    line[i++] = byte;
    Dovrebbe essere:
    codice:
    *line = byte;
    Errore che poi prosegui anche in:
    codice:
    char* newb = new char;
    memcpy(&line[i],newb,sizeof(newb));
    perchè newb è un puntatore, e una sizeof di un puntatore da la dimensione di un puntatore, non di quello a cui punta. In questo caso la dimensione è 4 (per 32bit) oppure 8 (per 64 bit).
    In pratica stai forzando la memcpy a copiare 4/8 bytes, vale a dire oltre il limite massimo di line.
    Corretto sarebbe:
    codice:
    memcpy(line,newb,sizeof(char));
    ma inutile per due motivi:
    1) basta fare *line = *newb;
    2) cosa contiene newb? Lo crei, ne copi il contenuto indefinito da un'altra parte e poi lo cancelli.
    codice:
    line[i] = NULL;
    qui vai a scrivere in una locazione che non esiste per quando scritto sopra.

    Una possibile alternativa per fare quello che ti serve è questa:
    codice:
    char* FileTextReadLine(FILE* file)
    {
    	unsigned char byte;
    	int char_read;
    	int count=0;
    	do {
    		char_read = fgetc(file);
    		if ( char_read == '\n') break; 
    		count++; // caratteri letti.
    	} while (c != EOF); // Fine file?
    	fseek(file,0,SEEK_SET);
    	char* line = new line[count];
    	int read_byte = fread(line, count,1,file);
    	line[read_byte]=NULL;
    	return line;
    }
    Però tutto questo è C. In C++ tutto si risolve in tre o quattro righe.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.