Newsgroup: it.comp.os.linux.development
Titolo: GTK_TEXT e fscanf, sto impazzendo... :-(

Continuano i  casini con la  maledetta GTK_TEXT. Adesso devo  leggere un
file temporaneo che ho già e riportare il testo dentro alla GTK_TEXT. Ho
provato il coseguente codice:
....
FILE *tmp_file;
gchar *ichar;
gchar *read_text;
....
tmp_file = fopen("/tmp/filetemporaneo", "r");
while(fscanf(tmp_file, "%c", ichar) != EOF) 
	read_text = g_strconcat(read_text, ichar);
gtk_text_insert(GTK_TEXT(text), NULL, NULL, NULL, read_text, -1);
fclose(tmp_file);
....
e quello che ottengo è un segmentation fault. Penso che il problema stia
nel ciclo while, ma non so come sistemarlo.
Mi aiutate ancora una volta?
-- 
Non c'è più forza nella normalità: c'è solo monotonia.

 wrote:
-> Continuano i  casini con la  maledetta GTK_TEXT. Adesso devo  leggere un
-> file temporaneo che ho già e riportare il testo dentro alla GTK_TEXT. Ho
-> provato il coseguente codice:
-> 
-> ....
-> FILE *tmp_file;
-> gchar *ichar;
-> gchar *read_text;
-> ....
-> tmp_file = fopen("/tmp/filetemporaneo", "r");
-> while(fscanf(tmp_file, "%c", ichar) != EOF) 
-> 	read_text = g_strconcat(read_text, ichar);
-> gtk_text_insert(GTK_TEXT(text), NULL, NULL, NULL, read_text, -1);
-> fclose(tmp_file);
-> ....
-> 
-> e quello che ottengo è un segmentation fault. Penso che il problema stia
-> nel ciclo while, ma non so come sistemarlo.
-> Mi aiutate ancora una volta?
prova a usare un while cosi':
while(!feof(FILE)) {
	fscanf(tmp_file, "%c", &ichar);
	read_text = g_strconcat(read_text, ichar);
}
dovrebbe andare... (spero, non ho provato...)
bye
Gianluca
-- 
Check my home pages for my free software
http://www.infinito.it/utenti/chewbe/

 dovrebbe andare... (spero, non ho provato...)
ho dovuto mettere  al posto di FILE tmp_file, altrimenti  mi mandava una
serie di warning spaventosa. Fatto questo mi dice che
warnign: char format, pointer arg (arg 3)
e  se  eseguo il  tutto  ho  un bel  segmentation  fault.  Non so  se  è
importante ma ichar è un gchar.
Altre idee?


nel ciclo while, ma non so come sistemarlo.
non conosco la g_strconcat(), ma se funziona come strcat(), allora
read_text deve avere spazio per contenere il file.
potresti comunque saltare il passaggio e inserire la gtk_text_insert()
direttamente nel ciclo while...
-- 
" Ho visto cose, che voi umani non potreste immaginare.
Sequenze RTSCTS in fiamme al largo dei bastioni di Termios.
Ho visto stringhe C balenare nel buio vicino alle porte UART.
E tutti quei momenti andranno perduti per sempre, come lacrime nella pioggia.
E' tempo di morire... "

importante ma ichar č un gchar.
Se non sbaglio ichar era dichiarato come (grossomodo)
gchar *ichar
quindi cosa ci sta a fare quell' & nell'istruzione fscanf?
-- 
		Giuseppe Corbelli
    -=< A Metal Heart Is Hard To Tear Apart >=-
ANTI-SPAM: E-Mail address is fake. Substitute cowo with IHATESPAM.

 quindi cosa ci sta a fare quell' & nell'istruzione fscanf?
l'ho tolto, ma il risultato è segmentation fault.....


 direttamente nel ciclo while...
non ti viene in mente qualche altro modo per leggere da file?


 read_text = g_strconcat(read_text, ichar);
Domanda stupida: read_text e' un puntantore ad una area di memoria
abbastanza grande per contenere la stringa oppure g_strconcat alloca memoria
se serve?
ciao!
keii

 	read_text = g_strconcat(read_text, ichar);
Ma questo poi non funziona, perchà g_strconcat immagino richieda due char*
che puntino a due array di char null-terminated.
read_text poi sembra anch'esso non inizializzato....
Ma cosa devi fare? Leggere un file di testo e metterlo in buffer?
Max

che puntino a due array di char null-terminated.
si, infatti non funziona,
read_text dovrebbe essere qualcosa come:
gchar read_text[1000];
bzero(read_text,1000);
-- 
Il C e` un ottimo sistema per spararsi ad un piede. Con il C++ e` piu`
difficile, ma se ci riuscite vi portera` via l'intera gamba.
(Bjarne Stroustrup)

non ti viene in mente qualche altro modo per leggere da file?
preso direttamente da examples/text.c:
-----------------------------------------------------------
  /* Load the file text.c into the text window */
  infile = fopen("text.c", "r");  
  if (infile) {
    char buffer[1024];
    int nchars;
    while (1)
      {
	nchars = fread(buffer, 1, 1024, infile);
	gtk_text_insert (GTK_TEXT (text), fixed_font, NULL,
			 NULL, buffer, nchars);
	if (nchars < 1024)
	  break;
      }
    fclose (infile);
  }
-----------------------------------------------------------------


 bzero(read_text,1000);
Ma se read_test lo definisci così, questo
 read_text = g_strconcat(read_text, ichar);
ovviamente non si compila nemmeno.
Max

 preso direttamente da examples/text.c:
ehì! funziona. Thanks!


ovviamente non si compila nemmeno.
ammesso che g_strconcat() funzioni come strcat(), non riesco a capire
per quale motivo non si dovrebbe compilare:
----------------------------
    char s[1000]; /*stringa destinazione */
    char s2[]="stringadaappendere\n";
    bzero(s,1000);
    strcat(s, s2);
    printf("%s", s);
----------------------------
prova, e vedrai che funziona...
bye,
Alvaro


l'ho tolto, ma il risultato è segmentation fault.....
Mhhhh
Prova a spezzare la lettura da file e il ciclo while. Oppure non usare FILE
* ma un normale file descriptor (int).


>ovviamente non si compila nemmeno.
scusa Max, non ho visto il "read_text =" prima di g_strconcat()
effettivamente quello e` un errore...
comunque basta toglierlo :-)
bye.


 
No, non funziona. Come ho detto, se a te funziona è solo un caso. L'ho
provato su due sistemi con due versioni del gcc e in entrami segfaulta
alla prima fscanf.
Ripeto: se non assegni un valore al puntatore, il valore che ci trovi non
deve essere considerato valido. 
Max

solo un caso. (Per inciso, scusa il C++ non c'entrava nulla, anzi, in
MAX, HAI PERFETTAMENTE RAGIONE !!!!
Ho fatto un errore veramente grossolano...
mi scuso per aver insistito, ma la mia ignoranza a volte e` indomabile :-(
-- 
Legge di Finagle
"Se un esperimento funziona, qualcosa e` andato male"