Output inaspettato C

di il
2 risposte

Output inaspettato C

Salve,
ho un problema con questo pezzo di programma che dovrebbe prendere gli elementi presenti in un file ed aggiungerli ad una lista.
Come si puo' vedere dal output si presentano degli elementi che non ci dovrebbero essere .. ho supervisionato piu' volte il codice ma a me pare corretto.

il file e' un file creato in windows con il blocco note e salvato come .csv.

Proprio non capisco e sono curioso di sapere dove sta' l inghippo.
Grazie in anticipo!!!!

MAIN
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>  //sqrt(n)
#define BUF_SIZE 30

struct elemento_lista{

  int dati_divisi[10]; //array che contiene in ogni posizione un dato del csv [cod,x,y,z,gg,mm,aaaa,ora,min,n_eventi]
  struct elemento_lista *nodo_nextPtr;

};
typedef struct elemento_lista elemento;
typedef elemento *lista_elementi;

//prototipi di funzione
void aggiunta_coda(lista_elementi *, char *); //aggiunge gli elementi del .csv ad una lista gia' divisi
void stampa_DEBUG(lista_elementi *);
//inizio main

int main(){

  char *end;
  FILE *file_eventi;
  lista_elementi testa = NULL;
  int raggio = 0;
  char nome_file[30];


  //apertura file con controllo
  printf("Inserisci il nome del file\n");
  scanf("%s", nome_file);
  //apertura file con controllo
  if((file_eventi = fopen(nome_file, "r")) == NULL){
    printf("Errore File\n");
    return 0;
  }

  printf("File aperto\n");

  while(1){ //aggiunge ogni stringa ad un nodo della lista concatenata

    char buf[BUF_SIZE];
    end=fgets(buf, 30, file_eventi);

    if(end == NULL){
      break;
    }

    aggiunta_coda(&testa, end);
  }
    stampa_DEBUG(&testa);
  printf("AAAAAAAAAAAAAAAAAAAAAAAAAA-\n");
  }
  
void aggiunta_coda(lista_elementi *l, char *dati){

  lista_elementi new = malloc(sizeof(elemento));
  new -> nodo_nextPtr = NULL;

  char *endLN = strtok(dati, ",:/");
  int i=0;

    while(endLN!=NULL && i<9){

      new -> dati_divisi[i] =  atoi(endLN);
      endLN = strtok(NULL, ",:/");
      i++;
    }

    new -> dati_divisi[9] = 0;


  if(*l == NULL){
    *l=new;
  }else{
    lista_elementi corr = *l;

    while(corr -> nodo_nextPtr != NULL){

      corr = corr -> nodo_nextPtr;
    }

    corr -> nodo_nextPtr = new;
  }
}
void stampa_DEBUG(lista_elementi *t){

  lista_elementi corr = *t;
  while(corr -> nodo_nextPtr != NULL){
    printf("----\n");
    for(int i=0;i<10;i++){
    printf("%d", corr -> dati_divisi[i]);
    printf("----");
  }
    corr = corr -> nodo_nextPtr;
  }
}
OUTPUT
Inserisci il nome del file
file.csv
File aperto
----
565----4----6----8----11----10----2017----11----30----0--------
756----5----9----1----12----12----2017----10----40----0--------
765-----8-----2-----1----6----1----2018----23----23----0--------
0----0----0----0----0----0----0----0----0----0--------
786-----9-----3-----8----7----1----2018----16----19----0--------
0----0----0----0----0----0----0----0----0----0--------
835-----4-----6-----2----8----1----2018----0----12----0--------
0----0----0----0----0----0----0----0----0----0----AAAAAAAAAAAAAAAAAAAAAAAAAA-

FILE
565,4,6,8,11/10/2017,11:30
756,5,9,1,12/12/2017,10:40
765,-8,-2,-1,06/01/2018,23:23
786,-9,-3,-8,07/01/2018,16:19
835,-4,-6,-2,08/01/2018,00:12
835,-2,-7,-2,08/01/2018,00:12

2 Risposte

  • Re: Output inaspettato C

    Probabilmente hai dei newline consecutivi. Esegui con il debugger e sicuramente troverai l'inghippo
  • Re: Output inaspettato C

    La funzione fgets legge max N-1 caratteri, compreso un eventuale newline, ed aggiunge un \0 in fondo alla stringa.
    Tu hai righe da max 29 caratteri visibili + 1 newline (quindi 30), la fgets legge 29 caratteri ed aggiunge uno \0 alla 30ma posizione, e lascia il '\n' nello stream, dove verrà letto in seguito, producendo una riga vuota, composta dal solo newline.
    Le soluzioni sono 2:
    • scarti le righe di lunghezza inferiore a 2
    • modifichi il codice in modo che venga catturato anche il 30mo carattere
    Io ti propongo la 2, modificata:
    #define BUF_SIZE 31
    .....
      while(!feof(file_eventi)){ //aggiunge ogni stringa ad un nodo della lista concatenata
    
        char buf[BUF_SIZE];
        memset(buf, 0, BUF_SIZE);	// meglio andar sul sicuro
        end=fgets(buf, BUF_SIZE, file_eventi);
    
    	if (strlen(buf) > 0)
    		aggiunta_coda(&testa, buf);
      }
Devi accedere o registrarti per scrivere nel forum
2 risposte