Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] Errori nello script

    Ciao a tutti
    Ho creato un programma che utilizza anche una libreria statica e lo compilo tramite un Makefile.
    Il programma deve stampare una lista di tutte le parole chiave, che trova nel file che gli passo come secondo parametro, che trova in un testo, che è il file che gli passo come primo parametro, sul file che gli passo come terzo parametro con il numero delle righe in cui compaiono. Questo programma funziona correttamente.
    Devo creare uno script che utilizzi questo programma e riceve come parametri: il primo è la parola chiave da cercare e gli altri sono file txt in cui cercare la parola chiave; deve stampare a schermo il nome dei file con le righe in cui compare la parola, per esempio:

    file1.txt
    1
    file2.txt
    4
    8

    Non sono molto pratica con gli script, ho scritto questo però mi da degli errori e non mi restituisce il risultato atteso.
    La logica però non mi sembra sbagliata.

    codice:
    #!/bin/bash
    parola=$1  #la parola da cercare
    n=$#  #n è il numero degli argmenti
    i=2
    
    make
    
    touch paroleChiave.txt  #creo il file paroleChiave.txt nel quale poi scrivo la parola da cercare nei vari file e che diventa il primo argomento per il programma
    cat $1 > paroleChiave.txt  #scrivo il primo argomento dello script (la parola chiave da cercare) nel file
    touch risultato.txt  #creo il file risultato.txt nel quale ho l'output del programma
    touch ris.txt  #creo il file ris.txt nel quale ho il risultato completo
    
    for (( i; i<n; i++ )) 
     do
      cat $i >> ris.txt #scrivo il nome del file nel risultato
      ./progetto paroleChiave.txt $i risultato.txt
      cat risultato.txt >> ris.txt #concateno l'output del programma al file dove tengo il risultato completo che poi visualizzo a schermo
     done
    
    cat ris.txt #visualizzo il contenuto del file
    Grazie a tutti!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Il problema, quindi, non riguarda il C, ma bash-scripting.

    Correggo il linguaggio di riferimento.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Guest
    Registrato dal
    Jun 2012
    residenza
    Espoo, Finland
    Messaggi
    286
    Ehm... non ho provato il tuo script perche' comunque non ho il programma pero'.... a meno che abbia frainteso il problema, non hai bisogno di un programma scritto ad hoc giusto per estrarre i numeri delle linee dove la parola chiave e' presente, assieme al nome del file. Ti basta usare grep:

    codice:
    grep -inH parola file1 file2 file3 | cut -d ":" -f1-2
    Ottieni un risultato tipo:

    codice:
    file1:1
    file1:2
    file1:8
    file1:14
    file2:2
    file2:3
    file2:5
    file3:1

  4. #4
    Il problema è che l'esercizio mi dice di utilizzare proprio quel programma!

    Comunque il codice del programma è questo:

    file principale (progetto.c)
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "progetto.h"
    
    int main(int argc, char *argv[])
    {
     FILE *fin_t;
     FILE *fin_p;
     FILE *fout;
    
     char p[20];
     char *parola;
     int r, i;
    
     int chiudit, chiudip, chiudio;
    
     if (argc != 4){
      printerror("Specificare tre file come argomenti.\n", 1);
     }
    
     fin_p = fopen(argv[1],"r");
     if (fin_p == NULL){
      printerror("Errore nell’apertura del secondo file.\n", 2);
     }
    
     fin_t = fopen(argv[2],"r");
     if (fin_t == NULL){
      printerror("Errore nell’apertura del primo file.\n", 2);
     }
    
     fout = fopen(argv[3],"w");
     if (fout == NULL){
      printerror("Errore nell’apertura del terzo file.\n", 2);
     }
    
     r = contaRighe(fin_p); //guardo quante parole chiave ho
    
     rewind(fin_p); //rimetto il puntatore all'inizio del file
    
     parola = fgets(p, 20, fin_p);
    
     for(i=0; i<r; i++){ //per quante volte sono le parole chiave
       trovaParola(parola, fout, fin_t); //eseguo la funzione trovaParola()
       parola = fgets(p, 20, fin_p); //vado alla parola successiva
       rewind(fin_t); //rimetto il puntatore all'inizio del file in modo da passarlo tutto ogni volta
     }
    
     chiudit = fclose(fin_t);
     if(chiudit == 0){
       printf("Chiusura del primo file corretta.\n");
     }else{
       printf("Errore nella chiusura del primo file.\n");
       return ;
     } 
    
     chiudip = fclose(fin_p);
     if(chiudip == 0){
       printf("Chiusura del primo file corretta.\n");
     }else{
       printf("Errore nella chiusura del primo file.\n");
       return ;
     }  
    
     chiudio = fclose(fout);
     if(chiudio == 0){
       printf("Chiusura del secondo file corretta.\n");
     }else{
       printf("Errore nella chiusura del secondo file.\n");
       return ;
     }
    }
    file con estensione .h (progetto.h)
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void printerror(char *str, int n);
    
    void trovaParola(char *parola, FILE *fileOut, FILE *fileIn);
    
    int contaRighe(FILE *fileIn);
    file con estensione .c (prog.c)
    codice:
    #include "progetto.h"
    
    void printerror(char *str, int n) 
    {
     fprintf(stderr, "Errore %d: %s\n", n, str);
     exit(n);
    }
    
    void trovaParola(char *parola, FILE *fileOut, FILE *fileIn)
    {
     char t[100];
     char *riga;
     int priga; //priga è il contatore delle righe
     char *p;
     riga = fgets(t, 100, fileIn); // leggo la prima riga del file
    
      //Scrivo la parola chiave nel file di output 
       if(fputs(parola, fileOut) == EOF){ 
         printerror("Errore nella scrittura della parola nel secondo file.", 3);
       }
    
    //printf("Ho scritto: %s\n",parola);
    
       //Quando leggo con fgets viene aggiunto un carattere alla fine della stringa letta. Quindi confrontando la parola letta, non verrà mai trovata nel testo a meno che non  sia alla fine. Per rimediare tolgo questo carattere
       parola[strlen(parola) - 1] = '\0'; 
    
       priga=1;
       while (riga != NULL){ //fino alla fine del testo
         p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga
         if (p != NULL){ // p=NULL se non ha trovato la parola nella riga
           if(fprintf(fileOut, "%d\n", priga) == EOF){ //scrivo il numero della riga nel file di output
             printerror("Errore nella scrittura della riga nel secondo file.", 3);
           }
         }
         riga = fgets(t, 100, fileIn); //vado alla riga successiva
         priga++; //incremento il contatore
       }
    }
    
    int contaRighe(FILE *fileIn)
    {
     int righe=0, i;
     i = fgetc(fileIn);
     while (i != EOF){
       if (i == '\n'){ 
         righe++;
       }
       i = fgetc(fileIn);
     }
     return righe;
    }
    e questo è il file Makefile
    codice:
    progetto: progetto.o libprog.a
    	gcc -o progetto progetto.o -L. -lprog
    %.o : %.c
    	gcc -o $@ -c $<
    libprog.a: prog.o 
    	ar r libprog.a prog.o
    clean:
    	rm *.o progetto *.a 
    
    prog.o: progetto.h
    progetto.o: progetto.h

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Chiara ... il codice del programma C non serve per il problema che hai ...

    La questione è sullo script bash ... o no ? Fai chiarezza perché non si capisce nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Io devo usare quel programma per fare lo script! Lo so che per il risultato che voglio si può usare la funzione grep ma io non posso usarla, devo usare quel programma..

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da ChiaraB92
    Io devo usare quel programma per fare lo script! Lo so che per il risultato che voglio si può usare la funzione grep ma io non posso usarla, devo usare quel programma..
    Questo si è capito ... quindi non ha senso postare tutto il codice C del programma.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    La persona che mi ha risposto prima mi ha detto che non avendo il codice del programma non poteva provare lo script quindi ho scritto il codice del programma

  9. #9
    Guest
    Registrato dal
    Jun 2012
    residenza
    Espoo, Finland
    Messaggi
    286
    Originariamente inviato da ChiaraB92
    La persona che mi ha risposto prima mi ha detto che non avendo il codice del programma non poteva provare lo script quindi ho scritto il codice del programma
    Beh, non avevi detto che si trattava di un esercizio e che pertanto avevi bisogno di scrivere un programma, per questo ti ho suggerito che potevi ottenere lo stesso effetto con un semplice comando
    Purtroppo non ho tempo al momento di provare il tuo programma etc, spero che altri intervengano

  10. #10
    Grazie cmq

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.