Aprire file da stringa

di il
16 risposte

Aprire file da stringa

Salve!
Ho un problema nell'apertura di un file. Sto implementando un client/server tcp ma il mio problema per ora riguarda l'apertura del file da trasferire con tcp. Dal client faccio partire una chiamata "GET filename" dove filename è il nome del file all'interno della directory di lavoro del programma. Questo "GET filename" viene memorizzato dal client in una stringa[BL] (BL è una costante) e spedito al server tramite il socket. Dal lato server quello che faccio è:

FILE *fp;
int i;
for(i = 0; string[i+4] != '\0'; i++) nuova[i] = string[i+4]; /*string[] contiene "GET filename" e nuova[] è l'arrey dove vado a mettere solo filename*/
if((fp = fopen(nuova, "r")) == NULL) printf("\nImpossibile aprire il file %s\n", invio);
/*altro codice*/
fclose(fp);				


Quello che scaturisce dalla fopen è un puntatore a null e infatti in out mi stampa "impossibile aprire il file". Non capisco proprio come fare! Qualcuno mi sa dire dove sbaglio?

16 Risposte

  • Re: Aprire file da stringa

    Quella for è sbagliata, eliminala e sostituiscila con

    strcpy(nuova, string+4);
  • Re: Aprire file da stringa

    Mah.. la stringa che esce con il tuo suggerimento(come anche quella che usciva dal ciclo for) in teoria è giusta però continua a non aprirmi il file! Qualche altra idea?
  • Re: Aprire file da stringa

    mrdaino ha scritto:


    Mah.. la stringa che esce con il tuo suggerimento(come anche quella che usciva dal ciclo for) in teoria è giusta però continua a non aprirmi il file! Qualche altra idea?
    No, il for era sbagliato comunque.

    Cosa hai dentro la string prima dell'apertura? Esaminalo con il debugger, carattere per carattere.
  • Re: Aprire file da stringa

    Sei sicuro che string[] contenga la stringa corretta? Se é cosí la soluzione di oregon é corretta, ammesso che string contenga una null terminated string.
  • Re: Aprire file da stringa

    Allora questo il modo con cui carico la stringa dal lato client:
    
    int leggi_linea(char *b) {
       int i=0;
       printf("-> ");
       do {
    	b[i++]=(char)getchar();
          } while(i<BL&&b[i-1]!='\n'&&b[i-1]!='\r'&&b[i-1]!=EOF);
       b[i] = '\0';
       return i;
       }
    
    Questa parte di codice è stata scritta dal professore.
    Poi con "write(sock, buffer, totale);"(buffer è l'array che passo alla funzione leggi_linea) invio la stringa al server, dove viene memorizzata con "read(fd, string, BL)". Quindi se io una volta avviato il programma dal lato client inserisco -> get filename, string del server dovrebbe contenere "get filename\0". Ora seguendo il tuo suggerimento in nuova[BL] dovrei avere "filename\0".
    Dopo di che faccio la fopen esattamente come ho scritto nel primo post su nuova.
  • Re: Aprire file da stringa

    Ah la fd sulla read arriva da qui:
    fd= accept(sock, (struct sockaddr *)&client, &client_len)
  • Re: Aprire file da stringa

    Il codice leggi_linea del tuo prof é errato. Inserisce il null character oltre la fine del buffer se la stringa che tu leggi é esattamente di dimensione BL (ammesso che BL sia la dimensione del character buffer?)
    Supponi BL=4, e la stringa in input di lungezza 4 anch'essa. Dopo aver letto i 4 chars, il while termina con i=5, e l'istruzione successiva é string[5]='\0', che é chiaramente un overflow.
    Inoltre, quando fai il write sul socket, immagino che la variabile totale abbia il valore i ritornato dalla funzione leggi_linea. Se é cosi', usando write(socket, string, totale), scrivi un numero di caratteri uguale al numero di caratteri letti, e non il terminating null character:
    stringa letta ab, i=2 -> fai il write di 2 byte (primi 2 caratteri), e '\0' viene perso.
  • Re: Aprire file da stringa

    Bisogna diffidare dei professori ...
  • Re: Aprire file da stringa

    Sopratutto se scrivono il codice in quel modo.. dovrebbero insegnare, quindi codice leggibile e pulito, invece la maggior parte delle volte fanno solo confusione..
  • Re: Aprire file da stringa

    Grazie per il sostegno ragazzi! Almeno non sono l'unico a pensarlo..
    Beh comunque a parte questo ho fatto tutto quello suggeritomi(BL comunque è sufficentemente ampio da non soffrire del bug dato dall'omissione del carattere speciale '\0'). La situazione comunque è sempre la stessa! Ho anche provato a passare la write con totale+1 perchè in effetti era ovvio che totale avrebbe dovuto essere un numero in più. c'è qualcosa che mi sfugge!
  • Re: Aprire file da stringa

    Questo tipo di problemi (con codice client/server) che interagisce, non è semplice da correggere in un forum a distanza.

    Devi fare un po' di debugging eseguendo le istruzioni una per volta ed esaminando il contenuto dei buffer e delle variabili. Solo così potrai comprendere il problema.
  • Re: Aprire file da stringa

    Eh grazie farò così. Stavo giusto cercando di apire come funziona il debugger di xcode sul mac ma ho qualche problema a caricare il programma! Ci riuscirò!
  • Re: Aprire file da stringa

    Si comunque anche usando il debugger si vede che dentro alla stringa nuova[] c'è "filename\0....". I puntini sono per dire che l'array è più lungo e quindi c'è dell'altra roba dentro, ma comunque essendoci il caratte speciale '\0' non hanno importanza i caratteri successivi giusto?
    beh oltre a questo ho provato a creare nuova[] dinamicamente in modo da farci stare dentro preciso "filename\0". Ancora niente! Non so magari è il mio compilatore che non ce la fa.. Il programma è giusto ma non va! Come ve lo spiegate?
  • Re: Aprire file da stringa

    Tra l'altro visto che dalla funzione leggi_linea del mio professore la stringa veniva riempita "filename\n\0..." io cerco di forzare \n a un \0 con:
    
    for(i = 0; string[i] < count; i++)    //count sarebbe l'esatta lunghezza dell'array che calcolo in precedenza
      if(string[i] == '\n') string[i] = '\0';
    
    però se faccio così la stringa diventa da "filename\n" a "filename". Allora è il debugger che non mi legge il carattere '\0' perchè anche lui lo considera come fine della stringa, oppure non esegue proprio il comando che gli do?
Devi accedere o registrarti per scrivere nel forum
16 risposte