Newsgroup: it.comp.lang.c
Titolo: Files - leggere, modificare, scrivere

Salve a tutti,
per creare thumbnails di foto sul mio sito web uso un programma che
scrive in automatico del codice HTML in un file. Uno stralcio e' qui
sotto:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- Created by Thumbnailer, copyright © Jussi Leinonen 2002 -->
<HTML>
<HEAD>
<TITLE>October 2005</TITLE>
</HEAD>
<BODY>
<H2>October 2005</H2><BR><BR>
<A HREF="IMG_0779.JPG">
<IMG SRC="IMG_0779_small.jpg" WIDTH=100 HEIGHT=75>IMG_0779.JPG
</A><BR><BR>                <----eliminare i <BR><BR>, lasciare </A> 
<A HREF="IMG_0780.JPG">
<IMG SRC="IMG_0780_small.jpg" WIDTH=56 + HEIGHT=75>IMG_0780.JPG
</A><BR><BR>                <----eliminare i <BR><BR>, lasciare </A> 
<A HREF="IMG_0782.JPG">
<IMG SRC="IMG_0782_small.jpg" WIDTH=100 + HEIGHT=75>IMG_0782.JPG
</A><BR><BR>                <----lasciare cosi'
....
....
Siccome tale codice produce foto a cascata una sotto l'altra, vorrei
scrivere un prog in C che metta tre foto in linea e poi vada a capo.
Per far questo devo eliminare i tags <BR><BR> la prima e la seconda
volta che compaiono, lasciarli alla terza e cosi' via.
Il prog che ho scritto - di seguito - da' un warning di compilazione
(passo a fputs un argomento incompatibile...) e non funziona.
Avete suggerimenti?
grazie in anticipo,
mirko
/* codice */
#include <stdio.h>
int main()
{
      FILE *fp_read;
      FILE *fp_write;
      char oneline[100];
      char word_match[]="</A><BR><BR>";
      char word_new[]="</A>";
      char *c;
      fp_read=fopen("d:\\C\\prog\\files\\html_originale.txt","r");
      fp_write=fopen("d:\\C\\prog\\files\\html_corretto.txt","w");
      do{
         c=fgets(oneline,100,fp_read);
         if (c!=NULL) {
            if (oneline==word_match)
               fputs(fp_write,word_new);
         }
         else fputs(oneline,fp_write);
      } while (c!=NULL);
      fclose(fp_fp_read);
      fclose(fp_write);
      system("PAUSE");
      return 0;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 grazie in anticipo,
Non ho guardato tutto il programma, ma salta subito all'occhio
un errore grande come una casa....
In C non esiste l'operatore == tra stringhe (anche perche'
il concetto di stringa esiste piu' che altro nella testa
del programmatore: trattasi di banale array di caratteri
con un carattere uguale a 0 (come valore binario, non come carattere)
che fa da terminatore.)
Per confrontare due stringhe e anche per fare altre
operazioni, come la copia o la ricerca di una sottostringa
usa le funzioni definite in string.h.
In particolare guardati la strcmp() che fa il confronto
tra  stringhe ed eventualmente la strstr() che trova
una sottostringa dentro una stringa data.
ciao,
g.

 (passo a fputs un argomento incompatibile...) e non funziona.
almeno potevi guardare che argomenti gli passavi: fputs vuole
un char* e poi un FILE* e tu glieli passi in ordine inverso.
Poi il programma non compila proprio perche' c'e' un fp_fp_read
che non esiste scritto al posto di fp_read nella fclose().
Poi il confronto con word_match, anche usando la funzione giusta, ovvero 
strcmp(),
sarebbe sbagliato perche' non tieni conto che (come e' scritto 
chiaramente nella documentazione di fgets), la funzione fgets legge
anche il carattere '\n' di fine linea e quindi stai facendo il confronto
con la stringa sbagliata.
Poi system() e' definita in stdlib.h che devi includere.
ciao,
g.

 g.
grazie mille e ciao
mirko
#include <stdio.h>
#include <string.h>
int main()
{
      FILE *fp_read;
      FILE *fp_write;
      int comp;
      char oneline[100];
      char word_match[]="</A><BR><BR>";
      char word_new[]="</A>";
      char *c;
      fp_read=fopen("c:\\C\\cprog\\html_originale.txt","r");
      fp_write=fopen("c:\\C\\cprog\\html_corretto.txt","w");
      do{
         c=fgets(oneline,100,fp_read);
         if (c!=NULL) {
            if (!strcmp(oneline,word_match))
               fputs(word_new,fp_write);
 
         else fputs(oneline,fp_write);
         }
      } while (c!=NULL);
      fclose(fp_read);


 ma non funziona...
sinceramente non capisco molto il senso di un approccio
al C basato su tentativi... non esiste l'operazione + tra stringhe...
comunque in teoria basterebbe scrivere "</A><BR><BR>\n"
in pratica (lacuna mia!) non sono sicuro che possa funzionare,
perche' non so se sul tuo sistema operativo (per esempio linux e win
differiscono) il fine linea sia indicato con uno o due caratteri.
Io, per tagliare la testa al toro, se dovessi fare quello che fai tu,
invece del confronto con l'uguaglianza, confronterei
solo la porzione di stringa che sicuramente non contiene caratteri
speciali (tipo fine-linea o ritorno-a-capo). Cioe' i primi 12 caratteri
di "</A><BR><BR>", tanto nel tuo file non esistono altre linee che 
cominciano in quel modo.
Quindi userei una cosa tipo
if (0==strncmp(oneline,"</A><BR><BR>",12)) {fai quello che devi fare}
la strncmp (sempre definita in string.h) confronta i primi k caratteri
di due stringhe e nel tuo caso andrebbe bene.
Per il system non lo so. Puo' darsi che il tuo compilatore che non
conosco includa automaticamente certi header.
ciao,
g.

 
con strncmp(oneline,"</A><BR><BR>",12) funziona che e' una meraviglia!
mi rimane la curiosita' di farlo funzionare con
...
char word_match[]="</A><BR><BR>\n";
...
if (0==strcmp(oneline,word_match)) (qualche azione)
...
che sembra non vada proprio. Faro' delle prove stasera.
Grazie mille dell'aiuto!
mirko


 che sembra non vada proprio. Faro' delle prove stasera.
se non va potrebbe essere che nel tuo sistema il fine linea
occupi 2 bytes e sia invece di \n qualcosa tipo \n\r (oppure \r oppure 
\r\n non ricordo).
Magari guarda bene la documentazione della fgets nella tua macchina.
ciao
g.

 mah, devC non mi dice niente, senza stdlib...
DevC/DevCpp linkano di default alcune librerie usate molto
frequentemente (come quelle che includono le funzioni prototipizzate in
stdio.h o stdlib.h).
Questo comportamento può essere inibito attivando l'opzione "Non usare
file/librerie standard per avvio di sistema" sotto Strumenti >> Opzioni
di compilazione >> Generazione di codice/ottimizzazioni >> Linker.
Ciao a tutti e scusate l'OT
Dark_Knight