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

    [c] : malloc e realloc con fgets

    Ciao a tutti,
    ho scritto questo codice, ma vorrei renderlo dinamico e non settare a priori la lunghezza di str[50] e temp[50]: qualcuno potrebbe scrivermi il codice che dovrei usare?
    Forse devo allocare una stringa lunga N e poi chiedermi se c'è "\n" : se non c'è allora aumento lo spazio di memoria allocata di n con realloc....
    ...il problema è che non so farlo!

    Grazie

    #include <stdio.h>
    #include <stdlib.h>
    #define M 50
    #define L 12

    typedef struct parametri
    {
    float fp;
    }p;

    int main (void)
    {
    p vet[L];
    char temp[M];
    char str[M];
    int i;
    FILE * fp;
    float f;

    fp = fopen("miofile.txt","r");
    if(fp==NULL){
    printf("Errore in apertura file");
    system("pause");
    exit(1);
    }

    i=0;
    while(fgets(temp,M,fp)!=NULL) {
    sscanf(temp,"%s",str);
    if (strcmp(str,"VOLUME")==0){
    fscanf (fp,"%*s %*s %f",&f);
    vet[i].fp=f;
    i++;
    fgets(temp,M, fp);
    }
    }

    fclose (fp);
    for (i=0;i<L;i++){
    printf("Falso positivo = %f\n",vet[i].fp);
    }
    system("pause");
    return(0);
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ma e' un problema reale o i motivi della tua scelta sono altri?

    In effetti potresti fare come hai detto, oppure potresti leggere carattere per carattere per trovare la posizione del \n, ma e' veramente utile?

    In un file di testo, una riga non e' mai lunghissima e anche se prevedi 4K fissi di buffer non e' sbagliato ...

  3. #3
    Mi è stato detto "dal capo" che sarebbe stato meglio allocare dinamicamente e non decidere a priori la lunghezza...
    Il mio problema è che non ho dimestichezza con la malloc...mi correggeresti questo codice?

    char *pm2;
    char *pm1;
    int dimbuf = 10;
    pm1 = (char *)malloc(dimbuf*sizeof(char));
    i = 0;
    while(fgets(pm,dimbuf,pFileIn)!=NULL) {
    // if l'ultimo carattere della stringa letta è "\n"
    //allora calcolo la lunghezza della stringa e alloco spazio di memoria di tale lunghezza
    pm2 = (char *)malloc(LunghezzaLetta*sizeof(char));
    sscanf(*pm2,"%s",str); //???
    .....
    else{
    dimbuf=dimbuf+5;
    realloc....
    }
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Scusa ... ho capito che e' una indicazione del tuo capo, ma dovresti fare (e suggerire al tuo capo di fare anche lui) una corretta analisi del problema.

    Che tipo di file state leggendo?

    Se il file e' di tipo testo e ne conoscete il probabile contenuto, e' *ragionevole* prevedere un buffer abbastanza ampio e lavorare con quello.

    Ripeto, un buffer di 4 K non ti pare abbastanza ampio? Rispondi analizzando il contenuto reale del file che veramente andrai a trattare ...

  5. #5
    Il file è di tipo .txt e ne conosco il contenuto attuale.
    Purtroppo ignoro quale sia lo spazio di memoria che occupa ciascun carattere... 4k non so bene quanto sia... diciamo che sulla riga più lunga conto circa 40-50 caratteri, le altre sono molto più brevi, forse 8bit*50caratteri=4kbit?

    Definire una stringa dunque come char str[50] può andare bene? La condizione è che il file a monte non cambi, giusto?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Con 4K intendo poco piu' di 4000 caratteri ... (4 kilobytes ...)

    Se le righe piu' lunghe sono da 50 caratteri e tu prevedi un buffer di 4000 sei a posto in tutti i casi ...

    Fossi in te non perderei tempo a fare un programma intricato e inefficiente solo per prevedere la corretta allocazione al byte della linea da leggere ...

    Prevedi 4000 caratteri per la tua linea e stai a posto ...

  7. #7
    ok, grazie, farò allora un char buffer[4000]...!
    Grazie,alla prossima.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.