Gestione testo con ruby e gtk

Ciao a tutti, sto creando un’applicazione che appena eseguita mi faccia
vedere il testo contenuto in un file prestabilito, permettendomi di
modificarlo e sovrascrivere il vecchio.

Sto lavorando con Gtk, quindi ho usato il seguente codice per creare un
texteditor :
#Immagazzina i dati immessi in TextBuffer
textbuffer = Gtk::TextBuffer.new
#Mostra i dati immagazzinati in TextBuffer
textview = Gtk::TextView.new(textbuffer)

Per salvare tutto quello che ho scritto invece ho usato :

#Apre o crea il file “database”
outfile = open(“database”, “w”)
#Inserisce nel file tutto quello che viene scritto dentro a “textbuffer”
outfile.write(textbuffer)

Per salvare il tutto, non appena premo il pulsante “Salva”, non faccio
altro che chiudere il file con:

outfile.close

Ora il problema è che se vado a controllare nella directory del
programma effettivamente trovo il file modificato, però quando vado a
riaprire il programma non mi mostra il contenuto del file
precedentemente modificato, ma mi da una finestra vuota, senza testo.
Io invece vorrei vedere il file con le ultime modifiche e poterlo
tranquillamente modificare (come se sto aprendo un file di testo con il
notepad…).

Cos’è che ho sbagliato ?

Forse sto risolvendo…

Ecco il codice usato :

http://img502.imageshack.us/img502/411/codicevr8.png

Con questo codice mi legge il file “database.txt”, però anzichè
mostrarmi il contenuto, mi mostra una strana sigla…

Questa : #<File:0x3023f70>

Cos’altro devo fare ?

Ho capito che la strana sigla non è altro che una stringa UTF-8… come
faccio a visualizzare il testo al posto di questa stringa ?

— Daniele V. [email protected] wrote:

Forse sto risolvendo…

Ecco il codice usato :

http://img502.imageshack.us/img502/411/codicevr8.png

Con questo codice mi legge il file “database.txt”,
però anzichè
mostrarmi il contenuto, mi mostra una strana
sigla…

perché quel codice nn ti legge affatto il file. Quel
file crea un oggetto File, che se mostrato come String
è appunto: #<File:0x3023f70>

Per leggere il file, devi usare “read” invece che to_s
nella riga 16.

Per il futuro, un consiglio: invece di creare
un’immagine, metti le 5 righe di codice nell’email.
Se sono tante, usa un servizio per incollare il codice
come pastie.caboo.se o www.rafb.net/paste, non uno per
l’upload di immagini


Goto 10: http://www.goto10.it
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  __________________________________________________________

Sent from Yahoo! - the World’s favourite mail http://uk.mail.yahoo.com

— Daniele V. [email protected] wrote:

Intanto grazie per la risposta, ho provato a fare
come mi hai detto ma
ancora non mi funziona, mi da sempre lo stesso
problema.

figurati, è un piacere essere utili.
Ma non credo ti dia lo stesso errore, perché ce n’è
uno nuovo :wink:

Quando scrivi nel file non ci scrivi il contenuto del
buffer, ma l’oggetto buffer.

La riga
database.write(testobuffer)
è equivalente a
database.write(testobuffer.to_s)
invece dovrebbe essere
database.write(testobuffer.text)

Una volta che hai sistemato questo errore, c’è un
comportamento che non so se è voluto: quando effettui
la scrittura, sei già alla fine del file (perché lo
hai letto all’inizio, e sei arrivato fino alla fine),
quindi qualsiasi scrittura sarà un’aggiunta, e non una
modifica. Se vuoi sostituire il contenuto del vecchio
file con il nuovo buffer devi effettuare un
File#rewind() riportando il puntatore interno del file
all’inizio.

Infine: non penso che questo faccia ciò che credi:
if File.exist?(“database.txt”) == true

qua apri in lettura ® e scrittura (+)

database = open(“database.txt”,“r+”)

puts “Apro il file”
else

#qua apri in sola scrittura (w)
#creando il file se esiste (+)
database = File.new(“database.txt”, “w+”)

end

File.new() non crea un nuovo file, crea un nuovo
oggetto file esattamente come open().

Per aprire un file in lettura/scrittura, e crearlo se
non esiste. basta che tu faccia

file = open(‘database.txt’, ‘rw+’)

Sicuramente faccio qualche procedimento sbagliato,
sto cercando di
imparare il più possibile.

beh, sei sulla buona strada, basta che fai un po’ più
attenzione a cosa c’è effettivamente scritto quando
hai un errore :wink:


Goto 10: http://www.goto10.it
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  __________________________________________________________

Sent from Yahoo! - the World’s favourite mail http://uk.mail.yahoo.com

Ciao, adesso va :slight_smile:

Solo che se mettevo “rw+” per aprire o creare il file :

" database = open(‘database.txt’, ‘rw+’) "

mi dava questo errore :

" illegal access mode rw+ (ArgumentError) "

Alla fine ho messo “a+” al posto di “rw+”, che fa le stesse cose (da
quello che ho letto)…

Per il fatto del " file.rewind" … forse è per questo che quando
vado a salvare il file senza aver modicato nulla, mi si duplica il testo
all’interno del file ?

Però anche se lo metto prima di “database.write” non mi cambia nulla :frowning:

button = Gtk::Button.new(“Salva”)
button.signal_connect(“clicked”) {
database.rewind()
database.write(testobuffer.text)
}

Cmq ti ringrazio ancora, domani mi cerco l’errore :wink:

— Daniele V. [email protected] wrote:

Ciao, adesso va :slight_smile:

Solo che se mettevo “rw+” per aprire o creare il
file :

" database = open(‘database.txt’, ‘rw+’) "

mi dava questo errore :

" illegal access mode rw+ (ArgumentError) "

colpa mia, rw+ non esiste. Io sono convinto di averlo
usato, ma pare che non funzioni, prova con
database = open(nomefile, File::CREAT|File::RDWR)

Alla fine ho messo “a+” al posto di “rw+”, che fa le
stesse cose (da
quello che ho letto)…

si, ma è sempre in “append mode”, cioè il cursore
comincia già da fine file. Se ti serve così meglio,
altrimenti usa l’esempio che ho scritto sopra.

Per il fatto del " file.rewind" … forse è per
questo che quando
vado a salvare il file senza aver modicato nulla, mi
si duplica il testo
all’interno del file ?

esattamente, tu sei alla fine del file e vai a
scrivere da capo il contenuto. Risultato:
duplicazione.

Però anche se lo metto prima di “database.write” non
mi cambia nulla :frowning:

button = Gtk::Button.new(“Salva”)
button.signal_connect(“clicked”) {
database.rewind()
database.write(testobuffer.text)
}

mh, a me funziona non saprei, forse è l’errore di cui
dicevamo prima.


Goto 10: http://www.goto10.it
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  ___________________________________________________________

Yahoo! Answers - Got a question? Someone out there knows the answer. Try
it
now.
http://uk.answers.yahoo.com/

Grazie ancora :wink:

Cmq il codice sicuramente adesso è esatto, forse sono io che non l’ho
sistemato bene, perchè mi continua a duplicare il contenuto.

Intanto grazie per la risposta, ho provato a fare come mi hai detto ma
ancora non mi funziona, mi da sempre lo stesso problema.

Se il tuo consiglio lo uso maneggiando solo codice ruby (quindi senza
gtk) allora funziona.
Se invece lo integro nella mia finestra grafica in gtk mi da problemi…

Stavolta allego il codice anzichè l’immagine.

Sicuramente faccio qualche procedimento sbagliato, sto cercando di
imparare il più possibile.

Grazie

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs