PDA

Visualizza la versione completa : [C++] Leggere il primo carattere di ogni stringa FILE DI TESTO


BrianCooper
10-03-2014, 15:41
Ciao ragazzi, premetto che ho fatto delle ricerche e ho trovato istrunzioni del tipo "getline(f1,buffer)".
Il mio problema è:
Contare quante righe del primo file di testo hanno il primo carattere uguale al primo carattere della riga corrispondente del secondo file.
Ho cercato di risolverlo così (avendo dichiarato un contatore int cont=0; )
while(f1.getline(line1,luns,'\n')&&f2.getline(line2,luns,'\n') //luns è la lunghezza max della riga
if(f1.get(c1)==f2.get(c2))// ho dichiarato c1 e c2 char
cont++;
c'è qualcosa che non va? In ogni caso il contatore mi viene visualizzato ad 1, qualunque siano i casi nell'esecuzione del programma e le inizializzazioni dei file.
PS=con i file ci lavoro da poco, ho creato un codice che mi permettesse di gestire una lista di candidati alle elezioni ed è andato tutto ok. Ma su questa traccia dataci dalla prof mi sono sentito spiazzato :messner:

Scara95
10-03-2014, 16:20
Ti conviene usare la classe string e la funzione std::getline
In ogni caso getline non ritorna mai false, ma sempre il parametro istream&.
Posta tutto il codice del tuo programma negli appostiti tag CODE.

BrianCooper
10-03-2014, 16:24
La prof ci fa usare la classe string.h... comunque il codice è questo:
Nella funzione punto1 c'è il codice che ci interessa... i punti 2 e 3 li ho messi in commento per compilare e ho modificato la condizione nell'if... ora il cont mi torna sempre 0 e non più 1...



//ESERCIZIO 4using namespace std;


#include <iostream>
#include <string.h>
#include <fstream>


const int luns=1000;


void inizializza(char nomef[]);
void visualizza(char nomef[]);
void menu(int &scelta);
void punto1(char nomef1[], char nomef2[]);
//void punto2(char nomef1[], char nomef2[]);
//void punto3(char nomef1[], char nomef2[]);


int main(int argc, char** argv)
{
char nomef1[luns], nomef2[luns];
int scelta;
do{
cout<<"Inserisci i nomi per file 1 e file 2"<<endl;
cin>>nomef1>>nomef2;
}while(strcmp(nomef1,"")==0||strcmp(nomef2,"")==0);
cout<<"PRIMO FILE"<<endl;
inizializza(nomef1);
cout<<"SECONDO FILE"<<endl;
inizializza(nomef2);
do{
menu(scelta);
switch(scelta)
{
case 1: punto1(nomef1, nomef2);
break;
//case 2: punto2(nomef1, nomef2);
// break;
// 3: punto3(nomef1, nomef2);
// break;
}
}while(scelta!=0);
return 0;
}




void inizializza(char nomef[])
{
ofstream f(nomef);
if(!f.is_open())
cout<<"Impossibile aprire il file"<<endl;
else
{
char line[luns];
do{
cin.getline(line,luns);
f<<line<<endl;
}while(strcmp(line,"fine")!=0);
f.close();
}
}


void visualizza(char nomef[])
{
ifstream f(nomef);
if(!f.is_open())
cout<<"Impossibile aprire il file"<<endl;
else
{
char line[luns];
while(f.getline(line,luns))
cout<<line<<endl;
f.close();
}
}


void menu (int &scelta)
{
cout<<"1. per contare il numero delle righe del primo con la stessa iniziale della riga corrispondente del secondo"<<endl<<"2. per trasferire nel secondo le righe di posto pari"<<endl<<"3 per trasferire in un secondo file le lettere con il case invertito"<<endl;
cin>>scelta;
}


void punto1(char nomef1[], char nomef2[])
{
ifstream f1(nomef1); ifstream f2(nomef2);
if(!f1.is_open()||!f2.is_open())
cout<<"ERRORE"<<endl;
else
{
char c1, c2, line1[luns], line2[luns];
int cont=0;
while(f1.getline(line1,luns)&&f2.getline(line2,luns))

if(line1[0]==line2[0])
cont++;

cout<<"Il numero delle righe e\' "<<cont<<endl;
f1.close(); f2.close();
}
}

Scara95
10-03-2014, 16:43
Usa i tag code, non quote. Comunque già dei suggerimenti te li ho dati prima.

BrianCooper
10-03-2014, 16:47
Scusa l'ignoranza ma i tag code come li metto? Comunque la prof (a detta di un mio amico) alla lavagna avrebbe fatto così... mi sento fuori luogo perchè non ho mai avuto problemi con il c++... ci sono errori nel codice forse? Se non volessi usare la libreria string?

Scara95
10-03-2014, 16:57
Non è indispensabile che usi string, ma non puoi utilizzare getline (sia metodo o funzione std::getline) come condizione del while, questo è certo. Il resto non ho voglia di leggerlo perché senza identazione e colorazione il codice è pressoché illeggibile...

I tag code si mettono con (code)codice sorgente (/code) utilizzando le parentesi [] al posto di () oppure con l'apposito pulsante nell'editor avanzato.

BrianCooper
10-03-2014, 16:59
ah ok grazie mille :)

BrianCooper
10-03-2014, 17:03
Ho modificato il while così... il contatore rimane a 0:



while(f1.eof()||f2.eof()) {
f1.getline(line1,luns); f2.getline(line2,luns);
if(line1[0]==line2[0])
cont++;
}

oregon
10-03-2014, 17:15
Con quella if non confronti due array di char ... Devi usare la funzione strcmp

BrianCooper
10-03-2014, 17:16
la strcmp è per confrontare 2 stringe, per dei caratteri basta '=='

Loading