Per non aprire un nuovo topic mi riaggancio a questo.
Anche io sto impazzendo dietro alla gestione di file.
In particolare sto cercando il modo di sostituire una stringa in un file che non ha un formato proprio.
Sono riuscito a creare uno script che, una volta chiesta la stringa da sostituire e quella in sostituzione (della stessa lunghezza), cerca e trova la riga del file che contiene la prima, estrae questa riga e la aggiorna con la seconda stringa, grazie a replace. Il problema è che non so come "registrare" questo aggiornamento nel file.
Vi posto il codice che esegue tutto ciò e una parte del file interessato.
script
void fileModification(char filename[])
{
// lettura del file
cout << "Lettura del file " << filename << " ...";
fstream file_op(filename, ios::in|ios::out);
cout << "fatto" << endl << endl;
// dichiaro le variabili stringa1 (da modificare), stringa2(da inserire) e testo (porzione di testo estratta dal file ad ogni iterazione while)
string stringa1;
string stringa2;
char testo[2000];
size_t pos = 0;
int notfound = 0;
// Chiedo di inserire la stringa da modificare
cout << "Digitare la stringa da modificare: ";
cin >> stringa1;
cout << endl;
// Cerco la stringa1 e la sostituisco con la stringa2
while(!file_op.eof())
{
// estraggo una riga dal file e la metto in testo
file_op.getline(testo,2000);
// converto 'testo' da array di char in tipo string (text) per poter usare i metodi find e replace della classe string
string text = testo;
// dichiaro una variabile size_t per memorizzare la posizione della stringa stringa1 in text
// cerco stringa1 in text e ottengo la posizione
pos = text.find(stringa1,0);
// se non trovo stringa1 in text dichiaro stringa non trovata
if(pos == string::npos) { notfound = 1; }
// altrimenti effettuo la sostituzione con stringa2
else
{
// chiedo la stringa da inserire
cout << "Digitare la nuova stringa [stessa dimensione della precedente]: ";
cin >> stringa2;
cout << endl;
cout << "Sostituzione di " << stringa1 << " con " << stringa2 << endl;
// il metodo replace sostituisce il testo in text, compreso tra 'pos' e 'stringa1.length()', con quello di stringa2
cout << "Contenuto di text prima: " << text << endl;
text.replace(pos,stringa1.length(),stringa2);
// file_op << text; non funziona!!!
cout << "Contenuto di text dopo: " << text << endl;
cout << endl;
cout << "Stringa sostituita con successo!" << endl;
return;
}
}
// se la stringa1 non è stata trovata lo dico
if(notfound == 1) { cout << "Stringa " << stringa1 << " non trovata!" << endl; }
file_op.close(); // chiude il file
}
Pezzo del file:
PC_BOARD
IDENTIFIER:='923-0420-03-01';
DESCRIPTION:='';
UNIT:=1 INCH;
WORKING_AREA:=[(0,0),(.03937008,.03937008)];
TECHNIQUE:=F;
VERSION
TL_REVISION:='2.00';
TL_COMMENT:='TL file generated by AUTOBOARD';
[...]
Per farla breve vorrei sosituire il codice
'923-0420-03-01'
con un altro della stessa lunghezza.
Come potete vedere l'istruzione
file_op << text;
non funziona.
Inoltre si osservi che il file è aperto sia in lettura che in scrittura con
ios::in|ios::out
Grazie dell'aiuto!