PDA

Visualizza la versione completa : [C++] Lettura di un file testo senza conoscerne a priori la dimensione


emi81
12-07-2007, 12:15
Come posso leggere il testo contenuto in un file, senza saperne la dimensione(righe, parole)

io apro il file cosi :



FILE *file;
file = fopen("file.txt","r+t");
if (file != NULL) {
leggi tutto il testo e salvalo in un buffer
}
fclose(file);


Qualcuno mi puo dire il codice da utilizzare per salvare il testo?
come faccio a determinare la lunghezza del buffer, se non conosco il testo ?


Grazie a tutti!

XWolverineX
12-07-2007, 13:11
Puoi provare un codice del genere


char *buffer = new char[500];
int filesize=0, bytes;
FILE *file = fopen("file.txt","r");
while (feof(file))
{
filesize+= fread(buffer,sizeof(char),500,file);
}

cout <<"Grandezza del file = " << filesize;
delet[] buffer;



Alla fine però in questo modo abbiamo comunque utilizzato la C runtime library...avendo a disposizione il C++ si possono utilizzare la classe fstream.

Se lavori su Win32 ci sono poi pratiche funzioni (GetAttributeFileEx) che ritornano lo stesso parametro che cerchi

emi81
12-07-2007, 14:15
lavoro con visual c++, è un progetto MFC.


in che senso posso utilizzare la fstream ?


con buff[500] se il testo ho piu di 500 caratteri come faccio?
i caratteri successivi vengono persi..

possi usare una CString buff; ?

Vincenzo1968
12-07-2007, 15:58
Ciao Emi,

se usi MFC le cose sono ancora più semplici.

Nell'esempio che segue, apriamo un file di testo utilizzando la classe MFC "StdioFile":



CStdioFile f;
CString strLinea;
CString strFile;

strFile = _T("C:\\MiaDirectory\\NomeFile.txt");

f.Open(strFile, CFile::modeReadWrite|CFile::modeCreate|CFile::mode NoTruncate);
while ( f.ReadString(strLinea) )
{
//Facciamo qualcosa con la riga appena letta
AfxMessageBox(strLinea);
}
f.Close();


Come vedi, puoi utilizzare CString per leggere i record a lunghezza variabile, senza bisogno di conoscerne in anticipo la dimensione.

Il file viene aperto in lettura-scrittura (opzione CFile::modeReadWrite).
CFile::modeCreate|CFile::modeNoTruncate permette di creare il file se non esiste; se esiste, invece, viene semplicemente aperto.

:)

emi81
12-07-2007, 16:26
Perfetto!

Grazie mille :ciauz: :ciauz:

Loading