PDA

Visualizza la versione completa : [C] Warning nella fopen mi blocca l'esecuzione.


benencio
28-11-2008, 19:04
Ragazzi sto impazzendo,ho un problema con un esercizio di Reti,il codice il seguente





sscanf(buff,"%s %s" ,nomefile,nome);
if((nomefile==0) && (nome==0))fputs("Errore sscanf",stdout); fd1=fopen(nomefile,"r");
if(fd1==NULL)fputs("Errore apertura file",stdout);
for(; ;){
riga=fgets(righe,MAXLINE,fd1);
sscanf(buff,"%s %d",stringa,&numero);
if(riga==NULL)break;
if(nome==stringa){
sprintf(num,"%d", numero);
break;
}
}
fclose(fd1);


Mi da un warning nella fopen ,come se il risultato della sscanf non fosse il file che gl'ho passato in buff:
warning: passing argument 1 of fopen makes pointer from integer without a cast

Mi dite dov' che sbaglio???
Grazie.

benencio
28-11-2008, 19:07
rimando il codice:


sscanf(buff,"%s %s" ,nomefile,nome);

if((nomefile==0) && (nome==0))fputs("Errore sscanf",stdout); fd1=fopen(nomefile,"r");
if(fd1==NULL)fputs("Errore apertura file",stdout);
for(; ;){
riga=fgets(righe,MAXLINE,fd1);
sscanf(buff,"%s %d",stringa,&numero);
if(riga==NULL)break;
if(nome==stringa){
sprintf(num,"%d", numero);
break;
}
}
fclose(fd1);

oregon
28-11-2008, 20:08
Ci mostri come hai dichiarato la variabile

nomefile


?

MacApp
29-11-2008, 15:45
ma dove la chiami la fopen?

ah.. la in alto a destra...
;-)

benencio
09-12-2008, 19:30
char nomefile;
cos l'ho dichiarata
ora vi posto tutto il codice:


/* server iterativo dell'applicazione echo che utilizza la select */

#include "basic.h"
#include "my_signal.h"

int
main(int argc, char **argv)
{
FILE *fd1;
int listend, connd, sockd;
int i, maxi, maxd,numero;
int ready, client[FD_SETSIZE];
char buff[MAXLINE],num[MAXLINE], nomefile, nome ,stringa, righe[MAXLINE],*riga;
fd_set rset, allset;
ssize_t n;
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;

if( (listend = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("errore in socket");

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

if( (bind(listend, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)
err_sys("errore nella bind");

if( listen(listend, LISTENQ) < 0 )
err_sys("errore nella listen");

maxd = listend; /* inzializza il numero di descrittori */
maxi = -1;
for ( i = 0; i < FD_SETSIZE; i++)
client[i] = -1; /* inizializza l'array client a -1 */

FD_ZERO(&allset); /* inizializza a zero tutti i descrittori */
FD_SET(listend, &allset); /* setta il descrittore di ascolto */

for ( ; ; ) {

rset = allset;
/* setta l'insieme di descrittori da controllare in lettura */

if( (ready = select(maxd+1, &rset, NULL, NULL, NULL)) < 0 )
err_sys("errore nella select");

if( FD_ISSET(listend, &rset) ) {
/* se arrivata una richiesta di connessione al socket di ascolto
viene invocata la accept e creato un socket di connessione */

cliaddr_len = sizeof(cliaddr);
if( (connd = accept(listend, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0)
err_sys("errore nella accept");

for(i = 0; i < FD_SETSIZE; i++)
if( client[i] < 0 ) {
/* scrive il descrittore del nuovo socket nel primo posto
libero di client */

client[i] = connd;
break;
}
if( i == FD_SETSIZE ) /* non ci sono posti liberi in client */
err_quit("troppi client");
FD_SET(connd, &allset);
/* altrimenti inserisce connd tra i descrittori da controllare */

if( connd > maxd )
maxd = connd;
if( i > maxi )
maxi = i;
if( --ready <= 0 ) /* cicla fino a quando ci sono ancora descrittori
leggibili da controllare */
continue;
}

for( i = 0; i <= maxi; i++ ) {
/* controlla tutti i socket attivi per controllare se sono leggibili */

if( (sockd = client[i]) < 0 )
/* se il descrittore non stato selezionato viene saltato */

continue;

if ( FD_ISSET(sockd, &rset) ) {
/* se sockd leggibile invoca la readline */

if ( (n = readline(sockd, buff, MAXLINE)) == 0) {
/* se la connessione stata chiusa dal client chiude il
descritore di connessione */

if( close(sockd) == -1 )
err_sys("errore nella close");
FD_CLR(sockd, &allset);
/* rimuove sockd dalla lista dei socket da controllare */

client[i] = -1; /* cancella sockd da client */
}
else{
sscanf(buff,"%s %s" ,nomefile,nome);
if((nomefile==0) && (nome==0))fputs("Errore sscanf",stdout);
fd1=fopen(nomefile,"r");
if(fd1==NULL)fputs("Errore apertura file",stdout);
for(; ;){
riga=fgets(righe,MAXLINE,fd1);
sscanf(buff,"%s %d",stringa,&numero);
if(riga==NULL)break;
if(nome==stringa){
sprintf(num,"%d", numero);
break;
}
}
fclose(fd1);




if( writen(sockd, num, strlen(num)) != strlen(num) )
err_sys("errore nella write");
}
if ( --ready <= 0 )
break;
}
}
}

}

oregon
09-12-2008, 19:49
Beh ... hai dichiarato

nomefile

come singolo char ... e invece deve essere un array di char (una stringa per il C).

P.S. Ce ne hai messo di tempo per rispondere ... non ricordavo piu' il problema ... :)

Loading