Newsgroup: it.comp.lang.c
Titolo: usare file in un programma c..

Devo usare un file di testo in un programma cgi scritto in C.
Il sorgente del programma è il seguente:
#include "stdio.h"
#include "stdlib.h"
typedef enum {false,true} boolean;
boolean exist_file(char *nomefile);
int main(void)
{
FILE *fp=NULL;
int contatore=0;
// Legge il dato dal file counter.txt
if(exist_file("counter.txt"))
{
fp=fopen("counter.txt","r+");
if(fscanf(fp,"%d",&contatore)!=EOF)
// lo incrementa
contatore++;
// Si riposiziona all'inizio del file
rewind(fp);
// lo riscrive
fprintf(fp, "%d",contatore);
fclose(fp);
}
// Il file non esiste, viene creato
else
{
fp=fopen("counter.txt","w+");
contatore=1;
fprintf(fp,"%d",contatore);
fclose(fp);
}
printf("Content-Type: text/html\r\n\r\n");
printf("<html>\n");
printf("<head>\n");
printf("<title>Prova contatore\n");
printf("</head>\n");
printf("<body>\n");
printf("<h1>Questa pagina è stata visitata %d volte</h1>\n",contatore);
printf("</body>\n");
printf("</html>\n");
return 0;
}
boolean exist_file(char *nomefile)
{
    FILE *fp;
    boolean exists=false;
    printf("Nome file=%s\n",nomefile);
    fp=fopen(nomefile,"r");
        exists=(fp!=NULL);
        //fclose(fp);
        return exists;
}
ma non mi funziona, c'è qualche errore sulla gestione dei file, perchè in 
locale funziona, ma quando lo copio nella cartella cgi-bin del mio web 
server apache locale, ottengo il seguente errore
"Errore del server!
Il server ha generato un errore interno e non è in grado di soddisfare la 
richiesta.
Messaggio di errore:
Premature end of script headers: http_counter.exe "
Sarà un problema di permessi di accesso al file ? 
Francesco

 server apache locale,
C'è qualche problema semantico tra "locale" e "locale".

 server HTTP.
Il log non dice niente di nuovo, solo "Premature end of script headers: 
http_counter.exe"

 http_counter.exe"
Ti servono più informazioni [1], ad ogni modo se in "locale", cioè 
lanciando direttamente l'eseguibile, funziona il problema non è del 
linguaggio C.
[1] 
http://www.jlk.net/apache/debugging_cgi.shtml

la butto li
intanto nella funzione boolean exist_file
stampi qualcosa prima del content type
inoltre apri il file ma non lo chiudi...
se fai cosi:
boolean exist_file(char *nomefile)
{
  FILE *fp;
  boolean exists=false;
  fp=fopen(nomefile,"r");
  exists=(fp!=NULL);
  if(exists)
    fclose(fp);
  return exists;
}
cambia qualcosa?
che server usi?
inoltre la cartella dove sta sto file è configurata per eseguire cgi?
ciao

 inoltre la cartella dove sta sto file è configurata per eseguire cgi?
Come si configura una cartella?


in ambiente windows boh?
credo:
AddHandler cgi-script .exe
(visto che parla di exe)
e poi nel virtual host la directory deve avere
Options ExecCGI
comunque il suo codice C scriveva sullo standard output una stringa
prima dell'header anche quello è un errore.

 printf("Content-Type: text/html\r\n\r\n");
è corretta.  *deve* stare prima dell'header html.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >



Allora, il programma era corretto, il problema stava nei permessi di 
scrittura nella cartella cgi-bin e sul file counter.txt Ho creato una 
cartella data all'interno di cgi-bin, con permessi di scrittura per 
l'utente (cioè io), e se lanciavo il programma dalla mia cartella home, 
il contatore si aggiornava correttamente. Ma se lanciavo il programma 
dall'url 
http://localhos/cgi-bin/http_counter.exe
 il contatore non si 
aggiornava. Allora ho scoperto che il programma quando eseguito da apache 
non aveva sufficienti permessi per la scrittura sul file counter.txt.
Ho impostato i permessi di scrittura sul file counter.txt, ed il 
programma ha funzionato senza problemi.
Francesco

 scrittura nella cartella cgi-bin e sul file counter.txt
Vedo adesso che controlli il valore restituito da fopen(), questo è male.
-Non incrociate i flussi, sarebbe male-

 -Non incrociate i flussi, sarebbe male-
Ovviamente era che *non* controlli (immagino).
In effetti il problema sarebbe stato scoperto subito se fosse stato
scritto qualcosa come:
if ((fp = fopen(fname, "r"))==NULL) {
    perror("fopen");
    /* ... */
}
Ciao!

 Ovviamente era che *non* controlli (immagino).
È Gozer il Gozeriano che mi mangia le parole.

 È Gozer il Gozeriano che mi mangia le parole.
eh, stai a vedere che i flussi toccherà incrociarli, allora.. ;-)