Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma C: non trovo l'errore!
Forum - C/C++ - Programma C: non trovo l'errore!

Avatar
ChiaraB92 (Normal User)
Newbie


Messaggi: 2
Iscritto: 07/06/2013

Segnala al moderatore
Postato alle 8:55
Venerdì, 07/06/2013
Ho scritto questo programma in C. Deve stampare una lista di tutte le parole chiave (che trova nel file che gli passo come secondo parametro) che trova nel 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.
Non mi da nessun errore di compilazione e neanche di esecuzione però non produce il risultato desiderato, perchè? Non riesco a trovare l'errore.

Questo è il codice del programma:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. //Funzione per gestire gli errori
  6. void printerror(char *str, int n)
  7. {
  8. fprintf(stderr, "Errore %d: %s\n", n, str);
  9. exit(n);
  10. }
  11.  
  12. //Funzione che trova la parola che gli passo in fileIn e scrive in fileOut
  13. void trovaParola(char *parola, FILE *fileOut, FILE *fileIn)
  14. {
  15. char t[100];
  16. char *riga;
  17. int priga; //priga è il contatore delle righe
  18. char *p;
  19. riga = fgets(t, 100, fileIn); // leggo la prima riga del file
  20.  
  21. //Scrivo la parola chiave nel file di output
  22. if(fputs(parola, fileOut) == EOF){
  23. printerror("Errore nella scrittura della parola nel secondo file.", 3);
  24. }
  25.  
  26. priga=1;
  27. while (riga != NULL){ //fino alla fine del testo
  28. p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga
  29. if (p != NULL){ // p=NULL se non ha trovato la parola nella riga
  30. if(fprintf(fileOut, "%d\n", priga) == EOF){ //scrivo il numero della riga nel file di output
  31. printerror("Errore nella scrittura della riga nel secondo file.", 3);
  32. }
  33. }
  34. riga = fgets(t, 100, fileIn); //vado alla riga successiva
  35. priga++; //incremento il contatore
  36. }
  37. }
  38.  
  39. //Funzione che conta le righe in fileIn e cioè le parole chiave
  40. int contaRighe(FILE *fileIn)
  41. {
  42. int righe=0, i;
  43. i = fgetc(fileIn);
  44. while (i != EOF){
  45. if (i == '\n'){
  46. righe++;
  47. }
  48. i = fgetc(fileIn);
  49. }
  50. return righe;
  51. }
  52.  
  53.  
  54. int main(int argc, char *argv[])
  55. {
  56. FILE *fin_t;
  57. FILE *fin_p;
  58. FILE *fout;
  59.  
  60. char p[20];
  61. char *parola;
  62. int r, i;
  63.  
  64. int chiudit, chiudip, chiudio;
  65.  
  66. if (argc != 4){
  67. printerror("Specificare tre file come argomenti.\n", 1);
  68. }
  69.  
  70. fin_t = fopen(argv[1],"r");
  71. if (fin_t == NULL){
  72. printerror("Errore nell’apertura del primo file.\n", 2);
  73. }
  74.  
  75. fin_p = fopen(argv[2],"r");
  76. if (fin_p == NULL){
  77. printerror("Errore nell’apertura del secondo file.\n", 2);
  78. }
  79.  
  80. fout = fopen(argv[3],"w");
  81. if (fout == NULL){
  82. printerror("Errore nell’apertura del terzo file.\n", 2);
  83. }
  84.  
  85. r = contaRighe(fin_p); //guardo quante parole chiave ho
  86.  
  87. rewind(fin_p); //rimetto il puntatore all'inizio del file
  88.  
  89. parola = fgets(p, 20, fin_p);
  90.  
  91. for(i=0; i<r; i++){ //per quante volte sono le parole chiave
  92. trovaParola(parola, fout, fin_t); //eseguo la funzione trovaParola()
  93. parola = fgets(p, 20, fin_p); //vado alla parola successiva
  94. rewind(fin_t); //rimetto il puntatore all'inizio del file in modo da passarlo tutto ogni volta
  95. }
  96.  
  97. chiudit = fclose(fin_t);
  98. if(chiudit == 0){
  99. printf("Chiusura del primo file corretta.\n");
  100. }else{
  101. printf("Errore nella chiusura del primo file.\n");
  102. return ;
  103. }
  104.  
  105. chiudip = fclose(fin_p);
  106. if(chiudip == 0){
  107. printf("Chiusura del primo file corretta.\n");
  108. }else{
  109. printf("Errore nella chiusura del primo file.\n");
  110. return ;
  111. }
  112.  
  113. chiudio = fclose(fout);
  114. if(chiudio == 0){
  115. printf("Chiusura del secondo file corretta.\n");
  116. }else{
  117. printf("Errore nella chiusura del secondo file.\n");
  118. return ;
  119. }
  120. }


PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 14:22
Venerdì, 07/06/2013
Quando viene letta la stringa, questa contiene un newline finale, dunque il programma rileva le parole chiave solo se si trovano alla fine della riga, visto che solo lì c'è un newline. Per sistemare ciò basta aggiungere:
Codice sorgente - presumibilmente Plain Text

  1. parola[strlen(parola) - 1] = '\0';


Dopo aver scritto la parola nel file (dopo la riga 24), in modo da rimuovere il newline finale solo dopo aver scritto la parola nel file (altrimenti vengono tutte unite).

Ultima modifica effettuata da ZioCrocifisso il 07/06/2013 alle 14:23


PM Quote
Avatar
ChiaraB92 (Normal User)
Newbie


Messaggi: 2
Iscritto: 07/06/2013

Segnala al moderatore
Postato alle 15:10
Venerdì, 07/06/2013
Grazie mille! :) :)

PM Quote