PDA

View Full Version : [C++] problema ricerca caratteri in fille txt


Rinho
07-05-2012, 12:29
Salve a tutti!
Devo leggere in c++ un file txt piuttosto pesante (3Gb) in particolare scorrere tutti i caratteri presenti, e "estrarre" da questo file solo determinati caratteri, in particolare quelli che sono preceduti dal carattere '>'.
Ad esempio per
>1
NNNNNNNNNNNNNNNN
CARATTERIDACOPIARE
NNNNNNNNNNNNNNNN
>2
NNNNNNNNNNNNNNNN
CARATTERIDACOPIARE
NNNNNNNNNNNNNNNN

vorrei estrarre solamente i caratteri "CARATTERIDACOPIARE", in modo da poterli in seguito inserire in una matrice, ma non so come fare.

Per prima cosa sto cercando nel file il carattere '>', ma quando compilo (uso dev-cpp) mi esce un errore relativo a strcmp(c,">"):
invalid conversion from 'char' to 'const char*'


char c;
while ( !file.eof() )
{
file.get(c);
if ( strcmp(c,">")==0 )
{
....
}
}

Spero di essere stato chiaro! Grazie !!

lorenzo001
07-05-2012, 13:32
strcmp serve a confrontare le stringhe (array di char) non semplici char come c

Devi usare una semplice if

if (c=='>') ...

vendettaaaaa
07-05-2012, 14:08
while (!file.eof()) non è correttissimo, sarebbe meglio while (file >> c).
Purtroppo non ricordo bene perchè, ma c'ero incappato anch'io tempo fa...forse perchè la prima volta che chiami eof() senza aver letto alcun carattere, file non ha ancora definito quella variabile. Quindi o while (file >> c) oppure prima del tuo while metti file.peek();

!fazz
07-05-2012, 19:08
while (!file.eof()) non è correttissimo, sarebbe meglio while (file >> c).
Purtroppo non ricordo bene perchè, ma c'ero incappato anch'io tempo fa...forse perchè la prima volta che chiami eof() senza aver letto alcun carattere, file non ha ancora definito quella variabile. Quindi o while (file >> c) oppure prima del tuo while metti file.peek();

penso che sono almeno 15 anni che uso eof() senza nessun problema

ovviamente vale quello che hai detto tu

getline

while(!fin.eof())
{
...
...
...
smandruppamenti vari della stringa
...
...
...


fin.getline

}

Rinho
07-05-2012, 21:46
ok, ho messo c=='>' ed effettivamente funziona...

Ma secondo voi è meglio usare cin.get o cin.getline (con quest'ultima prende l'intera stringa o ancora i caratteri)?

Sapreste anche dirmi come fare per prendere ciò che è dopo il ">1", ">2"...? :mc:

grazie!!

Rinho
08-05-2012, 10:42
Ho provato a scrivere codice cercando sui libri, per il vettore di char in cui inserire ciò che mi serve, ma non mi è chiara la scrittura con i doppi **: vettore è ancora un puntatore a char? che differenza c'è tra char* e char**?


char c;
char **vettore;
int i=0;

while ( !reference_fasta.eof() )
{
file.get(c);
if ( c!='>' )
{
if (c!= 'N')
{
cout << c;
vettore = new (char*); // allocazione dinamica?
for (i=0; i<reference_fasta.eof() ; i++)
genomariferimento[i]= c ;

}
}
}


anche qui quando (secondo me) assegno genomariferimento[i]= c; il compilatore dà errore.

lorenzo001
08-05-2012, 10:47
Se non dici nulla su cosa sia

genomariferimento

nè sul messaggio d'errore del compilatore, ci vuole la sfera di cristallo per risponderti ...

Rinho
08-05-2012, 12:15
Se non dici nulla su cosa sia

genomariferimento

nè sul messaggio d'errore del compilatore, ci vuole la sfera di cristallo per risponderti ...

hai ragionissima... scusate, non avevo modificato..:muro: :


char c;
char **vettore;
int i=0;

while ( !file.eof() )
{
file.get(c);
if ( c!='>' )
{
if (c!= 'N')
{
cout << c;
vettore = new (char*); // allocazione dinamica?
for (i=0; i<file.eof() ; i++)
vettore[i]= c ;

}
}
}

il messaggio d'errore relativo a vettore[i]=c è ancora " invalid conversion from 'char' to 'char*' "

lorenzo001
08-05-2012, 13:42
Beh ... è normale perchè utilizzi un doppio puntatore a char invece di un puntatore semplice.

Dovrebbe essere un semplice

char *vettore;

e poi allocarlo con

vettore = new char[100];

se ti servono 100 caratteri ...

Rinho
08-05-2012, 17:41
il problema è proprio che non conosco la grandezza del vettore a priori. devo scorrere tutto il file txt (di 3Gb) ed estrarre solo i caratteri che mi servono.

lorenzo001
08-05-2012, 19:34
Ma tu devi allocare un buffer utile per leggere e memorizzare una sola riga e poi leggere nello stesso buffer ogni riga, una dopo l'altra.

Poi devi precisare meglio che vuoi dire con "estrarre", ovvero, li vuoi scrivere in un altro file o portarli in memoria?

Rinho
09-05-2012, 09:15
devo creare un vettore in memoria che contenga la sequenza di caratteri che interessano dell'intero file.

tomminno
09-05-2012, 09:54
devo creare un vettore in memoria che contenga la sequenza di caratteri che interessano dell'intero file.

Già che parliamo di C++ perchè non usarlo veramente?
Usa std::vector<char> invece di un array di char.

In ogni caso se il file è di 3Gb tenere tutto in memoria non è propriamente l'ideale. Servirebbero soluzioni alternative.