Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 35
  1. #1

    [C]Server e client con fifo e lettura file

    Salve a tutti,
    premetto che sono un novizio in linguaggio C,dunque scusatemi per la banalità delle mie domande.
    Veniamo al nocciolo,dovrei risolvere il seguente problema:

    "Sia S un processo server e C un generico processo client. Il processo S che gestisce il file LIBRI
    contenente la dotazione di testi della biblioteca di una scuola dovrà essere attivo per una durata di
    100 sec. Il formato con il quale sono memorizzati i testi è il seguente:
    Titolo del libro\n
    Autore\n
    Numero di copie\n
    Si supponga che il file LIBRI sia ordinato in ordine lessicografico crescente rispetto al titolo del
    libro.
    Il processo client C gestisce le richieste di ricerca di un testo contenuto nella biblioteca da parte
    degli utenti della scuola. La richiesta può contenere o il Titolo del libro oppure l'Autore. Ad ogni
    richiesta il server S risponderà inviando tutti i libri che soddisfano la condizione.
    I processi client, ricevuta la comunicazione da parte del server, termineranno la loro esecuzione.
    La comunicazione tra client e server avverrà tramite FIFO."

    Diciamo che con le fifo non ho particolari problemi:creo la well know fifo dal quale il server legge la richiesta del client e creo una fifo client per il responso.
    Il problema numero 1 che incontro è però quando devo leggere dal file LIBRI...come faccio a leggere solo i titoli o solo gli autori?
    Il problema numero 2 ,più banale, come faccio a far rimanere attivo il server per 100 secondi?

    Grazie mille a tutti.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C]Server e client con fifo e lettura file

    Originariamente inviato da contemax83
    Il problema numero 1 che incontro è però quando devo leggere dal file LIBRI...come faccio a leggere solo i titoli o solo gli autori?
    Ma il client dovrà chiedere comunque l'autore del libro X no? Non può chiedere "l'autore" e basta... se è così, e se la struttura del file è quella che hai indicato, ti basta leggere il file stringa per stringa con la fgets(); non appena trovi il titolo X che ti interessa, leggi la stringa successiva (che è l'autore del libro) e la mandi al client.

    Originariamente inviato da contemax83
    Il problema numero 2 ,più banale, come faccio a far rimanere attivo il server per 100 secondi?
    Puoi calcolare il tempo tra le prime istruzioni del server con time() e chiami il valore ottenuto con qualcosa come "start_time", poi ricalcoli periodicamente il tempo sempre con la stessa funzione e fai la differenza con start_time con la funzione difftime(), che restituisce la differenza in secondi con un tipo double: quando questa risulta >= 100, fai terminare il server.

    http://www.cplusplus.com/reference/clibrary/ctime/
    every day above ground is a good one

  3. #3
    Ciao,grazie per la risposta,ma putroppo la traccia è proprio quella.Avevo pensato ad una cosa del genere ma nn so se funge:

    <code>
    #include <stdio.h>
    #include <sys\types.h>
    #include <stdlib.h>




    typedef struct{
    char titolo[30];
    char autore[15];
    int copie;
    }testo;

    main(){
    int j=0;
    FILE *fp;
    testo libri[10];

    fp=fopen("libri.txt","r");

    while(!feof(fp)){
    fscanf(fp,"%s %s",&libri[j].titolo,&libri[j].autore);
    j=j+1;}
    </code>

    in modo da estrapolare ciò che mi serve leggendo tutto il file.E' davvero un casino
    Nn so proprio come risolverla.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma la traccia dice

    La richiesta può contenere o il Titolo del libro oppure l'Autore
    Fin quando si tratta del titolo va bene, ma la richiesta di un "autore" che senso ha se non si specifica il libro? Forse serve solo a sapere se quell'autore è presente tra quelli della biblioteca? In ogni caso non cambia molto: una volta che il server ha ricevuto il nome dell'autore legge il file alla ricerca di quel nome, comunicando poi l'esito della ricerca al client. Basta usare fgets()...

    PS: i tag code sono bbcode, non html. Usa le parentesi quadre anziché le angolari.
    every day above ground is a good one

  5. #5
    credo che a seconda dell'autore digitato debbano venir fuori i suoi libri.Cmq ho qualche problema con la fgets...questo codice non funge mi si ferma alla prima printf "Errore nell'apertura del file il file non esiste",eppure il file che gli do in input esiste e sta sul desk esattamnte come l'eseguibile del programmino.
    codice:
        #include <stdio.h>
       #include <stdlib.h>
         
        FILE *f;
        char filename[60];
        char s[100];
         
        int main(void)
        {
             printf("Inserire il nome del file\n");
             gets(filename);
        
          f = fopen(filename, "r");
        
           if (f==NULL) printf("Errore nell'apertura del file il file non esiste");
         else
          {
           while (!feof(f)){
       if (!fgets(s, 100, f)) printf("Errore nella lettura dal file\n");
       printf("%s \n", s);
       }
        
       fclose(f);
       }
        
       int ch = getchar();
        
       return 0;
       }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non usare la gets() per leggere il nome del file, ma la fgets(). La gets() è deprecata per motivi di sicurezza.

    codice:
    fgets(filename, 60, stdin);
    filename[strlen(filename) - 1] = '\0';
    Per quanto riguarda l'apertura del file che fallisce, assicurati che il file stia nella stessa directory dell'eseguibile (a meno che non digiti il path completo), che il nome sia corretto e che tu abbia i permessi di lettura. In ogni caso, modifica così:

    codice:
    if (f == NULL) {
            fprintf(stderr, "Error: %s\n", strerror(errno));
            exit(-1);
    }
    e vedi cosa ti esce scritto.

    EDIT1: includi l'header file string.h se non lo hai già fatto.
    EDIT2: perché dichiari globali le variabili senza che ce ne sia alcun REALE bisogno?
    every day above ground is a good one

  7. #7
    "No such file or directory".Non è possibile il file è un file di testo (libri.txt),e sta sul desktop insieme al sorgente e all'eseguibile del file.Il mio ambiente di sviluppo è dev-c++ sotto vista.Cmq provo a risolvere il problema originario (quello del titolo e dei libri con la fifo) e appena possibile posto in modo che,se ti va,dai un occhiata al codice e mi dai qualche consiglio.Cmq davvero grazie 1000 dell'aiuto.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Hai sostituito la gets() con le istruzioni che ti ho detto? Puoi anche provare a passare il nome del file da riga di comando, anziché leggerlo da tastiera.
    every day above ground is a good one

  9. #9
    Si, ho sostituito come mi hai spiegato prima,ma nulla.Cmq ho pensato un pò a come risolvere il problema originario:

    almeno per quanto riguarda il server

    -creo una struttura del genere
    codice:
    struct richiesta{
    char titolo;
    pid_t pid;
    char msg[30];
    }msg;
    -creo e apro in lettura la well know FIFO per leggere la richiesta del client
    codice:
     mkfifo("C_S.FIFO",0666); //well know fifo      
           
           while(1){
                    fd=open("C_S.FIFO",O_RDONLY);
                    if(read(fd,&msg,sizeof(msg))<=0)          //il server apre la well know fifo in lettura per leggere la richiesta dal client
                       printf("Errore lettura da Fifo\n");
                       
                    if(close(fd)<0)
                       printf("Errore chiusura fd\n");
    -apro il file libri in lettura
    codice:
    fp=fopen("libri","r");
    if(fp==NULL)printf("Errore lettura file\n");
    -scorro le stringhe del file con la fgets() e le comparo con la richiesta del client
    codice:
    while(!feof(fd)){
    if(!fgets(s,100,fp))printf("Errore");
    if(strcmp(msg.titolo,s)==0)break; //questa dovrebbe essere la stringa che cerco
    }
    -non mi resta che scriverla sulla fifo di ritorno
    Non so se va bene,sicuramente ho commesso qualche banalità.Ti ringrazio ancora per l'aiuto.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Posta il codice completo e compilabile per l'apertura del file (non necessariamente tutto il programma, basta la parte del codice relativa), perché non ha senso che non vada bene...

    Perché hai messo un tipo pid_t nella struttura?

    L'ultimo ciclo ti consiglio di scriverlo così

    codice:
    while (fgets(s, 100, fp) != NULL) {
            s[strlen(s) - 1] = '\0';
            if (strcmp(msg.titolo, s) == 0) {
                    printf("le stringhe sono uguali\n"); /* fai qualcosa */
            }
    }
    s[strlen(s) - 1] = '\0' serve ad eliminare (sostituendolo con '\0') il carattere '\n' che la fgets() aggiunge in automatico alla fine della stringa letta. E' essenziale, altrimenti s e msg.titolo non risulteranno mai uguali perché s avrà sempre un '\n' alla fine.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.