Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - files c++
Forum - C/C++ - files c++

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gismo (Normal User)
Rookie


Messaggi: 43
Iscritto: 07/01/2007

Segnala al moderatore
Postato alle 10:42
Lunedì, 24/12/2007
Buon natale a tutti..
qualcuno di voi sa come gestire il testo contenuto in un file txt da console c++?
mi spiego meglio..stò sviluppando un editorino di testo su riga di comando..stile *unix..però sotto windows..

il problema è questo..
non capisco come posso fare per accedere a specifiche righe del testo..e in particolar modo modificarle..
Tutto questo con le librerie di I/O su files..

fatemi sapere..

P.s. accetto anche consigli e suggerimenti su eventuali opzioni da inserire..:)

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 16:50
Lunedì, 24/12/2007
con C++ basta leggere usando getline la varie rige (usando la classe string), poi si mettono le varie righe in un vector<string>, a questo punto tu farai lavorare l'utente sul vector di string e appena dirà di salvare sovrascriverai tutto il fle riversando il vector modificato

PM Quote
Avatar
gismo (Normal User)
Rookie


Messaggi: 43
Iscritto: 07/01/2007

Segnala al moderatore
Postato alle 21:01
Mercoledì, 26/12/2007
grazie net..
però ora vorrei porti una domanda un pò di più complessa..
mettiamo che io apro il suddetto file di testo..
e voglio modificare la 5° riga..
che contiene.. "C'era una volta a Iolo."
modificarla e aggiungere..in mezzo alla "stringa"
"Cecco Rivolta"..
Quindi nella riga (quindi nel file) si visualizzera..
"C'era una volta Cecco Rivolta a Iolo.":rotfl:

Ci siamo capiti?:)
Immagino che sia una cosa molto difficile..
però al momento nn ho idea di come poter fare una cosa del genere..

grazie mille

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:24
Mercoledì, 26/12/2007
io userei il metodo insert dell'oggetto string:

http://www.cppreference.com/cppstring/insert.html

come parametri accetta il punto in cui inserire e la stringa effetivamente da inserire, per trovare il punto bisognerebbe guardare la posizione del carret, a questo punto però per poter sfruttare a pieno le caratteristiche della console di windows bisognerebbe usare la API (per gestire appunto la posizione del carret ad esempio).

Pensandoci un'altra tecnica è gestire tutto in un'unica stringa, e ad ogni modifica pulire lo schermo e ristampare, usando magari un "carret virtuale"

quindi tu leggi dal file il testo che andrà tutto in una string, poi il vero carret della console starà in fondo ad attendere l'input e un tuo finto carret (|, _ decidi tu un simbolo) starà alla posizione iniziale (inserito nel buffer proprio) e tieni memorizzata la sua posizione e se preme le frecce aggiorni la posizione e modifichi buffer, per candellare un carattere in una posizione si usa il metodo erase e sempre insert (che ha un overload per un singolo carattere) inserisce il carret alla nuova posizione.
Se l'utente preme un carattere qualsiasi darai l'insert di quel carattere nell'ultima posizione del carret memorizzata e poi la incrementi (perchè il carret si sarà spostato) e ad ogni modifica cancelli tutta la console e ristampi il vettore aggiornato.
Per cancellare lo schermo puoi ricorrere o al comando cls di windows tramite la funzione system o una più brutale tecnica di ciclo che stampa tanti \n quante sono le righe (più portabile ma il carret reale non torna su.. il che è solo un pò più brutto da vedere).
Se ti basta la portabilità unix/windows (che effetivamente è già tanto) fai un if di preprocessore e usi cls se si compila su windows clear altrimenti.

Ultima modifica effettuata da netarrow il 26/12/2007 alle 21:30
PM Quote
Avatar
gismo (Normal User)
Rookie


Messaggi: 43
Iscritto: 07/01/2007

Segnala al moderatore
Postato alle 21:38
Mercoledì, 26/12/2007
perdona la mia ingoranza ma cos'è il carret virtuale?
anzi il carret 8-|

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 12:50
Giovedì, 27/12/2007
Il carret è quella barretta che ti dice in che posizione stai per scrivere, di solito è un | che lampeggia altre volte un _ come nella console di windows.

Per carret virtual indendevo dire che il vero carret della console sta in fondo a leggere l'input, e un finto carret lo aggiungi tu nel buffer rappresentante il file.

Ah quando salvi ricordati di rimuoverlo sennò salverai anche quel carattere in più.

Esempio:

se hai un file contenente

Ciao a tutti qualsiasi testo c'era una volta
pinco pallino bau bau miao miao

tu leggerai tutto e lo metterai in un unica string, ecco un codice di esempio per farlo:

Codice sorgente - presumibilmente C++

  1. #include <string>
  2. #include <fstream>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6. ...
  7. string tmp
  8. string buffer = "";
  9. ifstream in("file.txt");
  10. while(in >> tmp)
  11.   buffer += tmp;
  12. ...



quindi per aggiungere il "carret virtuale" all'inizio farai

Codice sorgente - presumibilmente Plain Text

  1. ...
  2. buffer.insert(0, '|');
  3. ...



e memorizzerai la sua posizione

Codice sorgente - presumibilmente C/C++

  1. ...
  2. unsigned int carretPosition = 0
  3. ...



quando uno premera la freccia farai buffer.erase(carretPosition) poi carretPosition++ e buffer.insert(carretPosition, '|') per spostare il carret (quallo finto, il vero carret sarà in fondo a beccare l'input dell'utente).

E così via, se uno premerà "c" farai buffer.insert(carretPosition, charread); dove charread sono i caratteri letti
e poi ovviamente sposterai avanti il carret come prima, cancellando il vecchio e rimettendolo avanti il nuovo

Ad ogni modifica del testo dovrai pulire tutto con system("cls"); e ristampare (a questo punto basterà un cout >> buffer; )

Ah per rendere tutto più fluido dovresti attendere l'input con qualche funzione non bufferizzata, quindi in modo che l'utente non debba premere invio e fare cINVIOiINVIOaINVIOoINVIO, ma come preme c automaticamente si deve saltare all'istruzione dopo (potresti usare conio.h o qualche altro header).
Ricordati prima di salvare il file di dare l'erase sul carret virtuale per non mettere nel file anche quello.

Ultima modifica effettuata da netarrow il 27/12/2007 alle 13:09
PM Quote
Avatar
gismo (Normal User)
Rookie


Messaggi: 43
Iscritto: 07/01/2007

Segnala al moderatore
Postato alle 23:22
Giovedì, 27/12/2007
ok..molto interessante..
però nn ho ben capito come faccio a gestirlo questo caret..
ci sono delle API tipo SetConsoleCursorPosition()
sull'msdn non sono molto esaurienti a livello di implementazione..
cmq ho capito quello che mi hai detto approposito del carattere che si muove partendo da l'inizio della pagina..
quello che ancora nn sono riuscito a capire è come rappresento il movimento delle frecciette a livello di caratteri?
mi spiego..
per fare quello che dici tu ce bisogno quanto meno di ricevere da input le istruzioni per dirigere lo spostamento..quindi servirà una switch o alcuni if per che incrementeranno o diminuiranno il contatore carretPosition..
ma come faccio a indicare al codice l'istruzione di -> o <- ?
non credo ci sia un riferimento ascii in proposito..come invece può esserci per un tasto alfanumerico.. :(
quindi nel getch(?) cosa ci metto?
ho visto che esiste una API che serve per leggere l'input in modo "automatico"..(ReadConsoleInput)
ma le api nn sono il mio forte..almeno per ora..

insomma dammi una mano ti prego..:asd:

grazie mille per il tempo che mi dedichi..

PM Quote
Avatar
gismo (Normal User)
Rookie


Messaggi: 43
Iscritto: 07/01/2007

Segnala al moderatore
Postato alle 23:34
Giovedì, 27/12/2007
ah scusa..ti volevo chiedere poi..
come mai quando eseguo le istruzioni
Codice sorgente - presumibilmente C++

  1. #include <string>
  2. #include <fstream>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6. ...
  7. string tmp
  8. string buffer = "";
  9. ifstream in("file.txt");
  10. while(in >> tmp)
  11.   buffer += tmp;
  12. ...



gli spazi nel file vengono ignorati?

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 12:03
Venerdì, 28/12/2007
ah si scusa, quando leggi le stringhe con

stream >> stringa

legge fino a uno spazio o a capo senza aggiungerlo, quindi nel punto

buffer +=tmp

aggiungi un + " " così

buffer += tmp + " ";

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo