PDA

Visualizza la versione completa : [C] Leggere file e salvarlo in una stringa


uMoR
09-01-2006, 17:59
Ho bisogno di leggere un file e salvarlo in una stringa.
Del file non so la grandezza quindi parto da:

char *testo;

qualcuno mi completa il codice please ? :D

topsoluzioni
09-01-2006, 18:43
Penso che l'unica soluzione sia creare un array di caratteri di dimensione statica (grande), leggere il file e poi copiare i campi inseriti nell'array in uno di dimensioni appropriate.

uMoR
09-01-2006, 18:47
se no la realloc ma sono impazzito :D

se qualcuno sa usarla meglio di me.. benvenga

topsoluzioni
09-01-2006, 18:56
con realloc verrebbe una cosa del genere credo:

FILE* fp;
char* testo,*temp;
int i=0;

fp=fopen("pippo.txt","r");
testo=(char*) malloc(sizeof(char));

while(fscanf(fp,"%c",&temp)!=EOF) {
testo=(char*) realloc(testo,(i+1)*sizeof(char));
*(testo+i)=temp;
i++;
}

testo[i]='\0';

Samuele_70
09-01-2006, 21:02
Originariamente inviato da uMoR
se no la realloc ma sono impazzito :D

se qualcuno sa usarla meglio di me.. benvenga

Ciao, dico anche la mia. :)
Visto che la dimensione del file nota a priori credo che sia meglio una malloc():


// MinGW code
#include <iostream>
//per il BCC32:
// #include <iostream.h>
#include <conio.h>

int main()
{
FILE *file;
char ch, *buff, FileName[256]="pippo1.txt";
int indice, fileDim = 0;

if (( file = fopen( FileName, "rb")) != NULL)
{
// 'Conto quanti bytes ci sono nel file
while( ! feof( file ) )
{
fgetc( file );
fileDim++;
}
fileDim--,
printf("Dimensione del file %s = %d\n", FileName, fileDim);

// Alloco la memoria necessaria per contenere il file +1
buff = (char*) malloc(sizeof(char) * fileDim+1);
// Mi riporto all' inizio del file
fseek(file, 0, SEEK_SET);

for(indice=0; indice<fileDim; indice++)
{
buff[indice] = fgetc( file );
}
printf("Contenuto del file :\n%s", buff);
fclose(file);
}
getch();
return 0;
}

La realloc() abbastanza lenta, meglio evitarla se possibile.

Samuele_70
09-01-2006, 21:19
Naturalmente potresti anche eliminare questo ciclo:



for(indice=0; indice<fileDim; indice++)
{
buff[indice] = fgetc( file );
}

con una fread() ...


fread(buff, fileDim, 1, file);

che si occupa di copiare tutto il file nel buffer.
:unz:

Samuele_70
09-01-2006, 21:33
Prometto che l'ultima versione :zizi:
Sicuramente la pi compatta:


#include <iostream>
#include <conio.h>

int main()
{
FILE *file;
char ch, *buff, FileName[256]="pippo1.txt";
int indice, fileDim = 0;
if(( file = fopen( FileName, "rb")) != NULL)
{
// Si posiziona alla fine del file
fseek(file, 0, SEEK_END);
// Legge la posizione attuale
fileDim = ftell(file);
// Alloca la dimensione del buffer
buff = (char*) malloc(sizeof(char) * fileDim+1);
printf("Dimensione del file %s = %d\n", FileName, fileDim);
// Mi riporto all'inizio del file
fseek(file, 0, SEEK_SET);
// Copio tutto il contenuto del file nel buffer
fread(buff, fileDim, 1, file);
printf("Contenuto del file :\n%s", buff);
// Chiudo il file
fclose(file);
}
getch();
return 0;
}

:unz:

uMoR
10-01-2006, 15:21
grazie a tutti l'ultimo funziona alla perfezione :smack:

Loading