Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C++ Problemi in lettura file

    Ho un file txt che leggo tramite fstream, in questo modo

    codice:
    	ifstream file;
    	file.open("F:/msg/mes.msg",ios::in);
    	file.seekg(0,ios::end);
    
    	long Len = file.tellg();
    	
    	char *stringa = new char[Len];
    	file.seekg(0,ios::beg);
    	file.read(stringa,Len);
    	string Stringa = stringa;
    	delete[] stringa;
    	file.close();
    La lettura avviene bene, ma alla fine del file mi ritrovo alcuni YYYYYIIIYI e simboli strani, comunque non contenuti nel file, come se ci fosse un eccesso nella lettura.
    Ho provato altri metodi (come file.get(), ma acquisire un carattere per volta è lentissimo e comunque prende i caratteri in piu').

    Ho provato anche con le api di C, ma, nonostante ha lo stesso problema, sembra non riuscire a leggere (in una sola volta) oltre un certo numero di caratteri.
    Suggerimenti?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #2
    Dovresti allocare la memoria così

    char *stringa = new char[Len+1];
    e poi aggiunger il terminatore alla c-string
    stringa[len]=0;
    Prima di copiarla in Stringa.

    Ma è meglio se usi : ifstream::rdbuf
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Usando rdbuf secondo l'esempio

    codice:
    	filebuf *pBuf;
    	pBuf = file.rdbuf();
    
    	long Len = pBuf->pubseekoff(0,ios::end,ios::in);
    	pBuf->pubseekoff(0,ios::beg,ios::in);
    
    	char *stringa = new char[Len];
    	pBuf->sgetn(stringa,Len);
    
    	string Stringa = stringa;
    Ottengo comunque questi caratteri.
    Anche provando a mettere il + 1 nel len (anche se nell'esempio non sembra essere richiesto).


    ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
    Anche col tuo suggerimento
    codice:
    	ifstream file;
    	file.open("F:/msg/mes.msg",ios::in);
    	file.seekg(0,ios::end);
    
    	long Len = file.tellg();
    	
    	char *stringa = new char[Len + 1];
    	file.seekg(0,ios::beg);
    	file.read(stringa,Len);
    	stringa[Len] = 0;
    	string Stringa = stringa;
    	delete[] stringa;
    	file.close();
    Ottengo le III...anche se mi sembra sbagliato perchè se faccio len + 1, il terminatore va su len + 1, credo.
    Ho provato anche in quest'altro modo, ma niente.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    c'è qualcosa che non va, sei sicuro che il file "mes.msg" sia un plain-text ?
    Hai provato a leggere il file in modalità binaria ?

    file.open("F:/msg/mes.msg",ios::in | ios::binary);

    per ifstream il flag ios::in è ridondante.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Il file .msg è un'email.
    La mia intenzione è quella di aprire l'email ed estrapolarne soltanto il testo effettivo dell'email, che è racchiuso tra <HTML> e </HTML>.
    La seconda operazione riesce bene (traminte string.find).
    Però non riesco a leggere il file come si deve...
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da XWolverineX
    Usando rdbuf secondo l'esempio
    codice:
    	filebuf *pBuf;
    	pBuf = file.rdbuf();
    
    	long Len = pBuf->pubseekoff(0,ios::end,ios::in);
    	pBuf->pubseekoff(0,ios::beg,ios::in);
    
    	char *stringa = new char[Len];
    	pBuf->sgetn(stringa,Len);
    
    	string Stringa = stringa;
    Se l'intenzione è di mettere tutto il file in una stringa puoi fare in modo più semplice.
    codice:
    #include <sstream>
       stringstream ss;
       ss << file.rdbuf();
       string Stringa (ss.str());

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Incredibile...nella stringa compaiono lo stesso i caratteri strani...ma nel file originale non ci sono!!!

    Ecco ancora come leggo il file
    codice:
    	ifstream file;
    	file.open("F:/msg/mes.msg",ios::in);
    
    	file.seekg(0,ios::end);
    
    	long Len = file.tellg();
    	char *stringa = new char[Len + 1];
    	file.seekg(0,ios::beg);
    	file.read(stringa,Len);
    	stringa[Len] = 0;
    	string Stringa = stringa;
    	delete[] stringa;
    	file.close();
    Devo postare proprio il file??? E' il codice originale di una qualsiasi email!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Anche con le API di win32!!

    codice:
    	this->file = CreateFile(FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    	this->Len = GetFileSize(this->file,NULL);
    	char *stringa = new char[Len+1];
    	DWORD Bytes;
    	ReadFile(this->file,stringa,Len,&Bytes,0);
    	string Stringa = stringa;
    	CloseHandle(this->file);
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    I byte "strani" sono sempre gli stessi? Hai provato a guardare con un editor esadecimale se ci sono per davvero?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Come editor uso quello integrato di Visual Studio Professional 2008: cliccando sul char desiderato mi fa vedere il suo contenuto.
    Quelle maledette i ci sono per davvero: dopo aver opportunamente modificato il file, lo scrivo su un nuovo file, e le lettere strane vengono scritte lo stesso. Proprio non so come fare.

    Comunque ora ho modificato usando le Api di Win32 (come avete potuto vedere), dovendo usare anche i servizi e roba varia. Però non funziona lo stesso
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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.