C - 16 - Lettura stringhe da file e elaborazione

Поделиться
HTML-код
  • Опубликовано: 25 дек 2024

Комментарии • 41

  • @frankvi1401
    @frankvi1401 11 лет назад

    davvero bravissimo nello spiegare, ci farò un esame grazie ai tuoi tutorial

  • @DenaRapper
    @DenaRapper 11 лет назад

    Grazie , probabilmente vedrai altri commenti miei in futuro dato che sto imparando a programmare con i tuoi tutorial :D

  • @CloseWave
    @CloseWave 5 лет назад

    Ma per il maiuscolo-minuscolo non basta usare MAIUSCOLO + 32 = MINUSCOLO? visto che negli ascii si trovano in posizione contigua.. cmq occhio che a 10:00 entra qualcuno dalla finestra, le cuffie ti isolano troppo!

  • @Ic3m4te
    @Ic3m4te 8 лет назад +1

    gran bel tutorial sei in gamba!

  • @carmhack
    @carmhack  12 лет назад

    Puoi usare la fgets, come primo parametro riceve la stringa che vuoi leggere, il secondo parametro è la lunghezza massima da leggere, e il terzo parametro è il puntatore al file.
    Esempio: fgets(str, 200, fp)
    Legge dal file a cui punta fp una stringa di massima 200 caratteri, tutto compreso.

  • @carmhack
    @carmhack  11 лет назад

    Grazie! :) In bocca al lupo!

  • @klajdimyftari4691
    @klajdimyftari4691 9 лет назад

    sei molto bravo!

  • @carmhack
    @carmhack  11 лет назад

    Scrivi ogni volta che ne hai bisogno :) Ricordati che mi trovi anche su fb :)

  • @francescobonni4178
    @francescobonni4178 12 лет назад

    come posso leggere da un file di testo un intero periodo di parole, cioè un' intera frase, compresi anche gli spazi? con il sottoprogramma che hai creato mi legge tutta la frase ma cancella gli spazi tra una parola e l'altra. puoi aiutarmi? grazie.

  • @carmhack
    @carmhack  11 лет назад

    Gli array monodimensionali sono puntatori al primo elemento (vai più avanti per capire cos'è un puntatore), quindi il compilatore sa già che per accedere all'n-esimo elemento deve andare a guardare n elementi dopo il primo. Il compilatore però non ha modo di conoscere , nel caso di un array bidimensionale (come nel nostro caso) la lunghezza di una riga, quindi dobbiamo passarla per forza, per permettergli di calcolare dov'è che inizia e finisce ogni riga. Spero sia tutto chiaro.. :)

  • @DenaRapper
    @DenaRapper 11 лет назад

    Ciao , senti : Perché al prototipo di funzione quando dichiari il secondo parametro char ,la prima dimensione la lasci libera e la seconda no ?

  • @andrealeto99
    @andrealeto99 5 лет назад

    1:12
    sfiorato incidente diplomatico

  • @matteovitale7391
    @matteovitale7391 8 лет назад

    Ciao, ottimo video ma non ho ben capito perchè nel minuto 6:28 affermi che nel secondo ciclo si va ad elaborare ogni carattere. Potresti delucidarmi?

  • @kevinmitnic1
    @kevinmitnic1 8 лет назад

    Se ho capito bene : se A< = (matrice [ i ] [ j ] )

    • @carmhack
      @carmhack  8 лет назад

      Non credo sinceramente che si possa fare anche in quel modo. Ma ci puoi provare :)

    • @TheNapolinews
      @TheNapolinews 6 лет назад

      Al massimo lo puoi fare gli operatori bitwise

    • @TheNapolinews
      @TheNapolinews 6 лет назад

      considera che minuscoli e maiuscoli differiscono per un solo bit in particolare che per i maiuscoli e' pari ad 1 e per i minuscoli è pari a 0, basta che conosci Codice Ascii e la conversione in binario

  • @TheAscentis
    @TheAscentis 11 лет назад

    Ciao ottimi tutorial davvero ;) ..Ma sono curioso di sapere se è possibile salvare e leggere dati da un server..Sei si può fare, come si fa??

  • @alessandroindelicato2806
    @alessandroindelicato2806 10 лет назад

    a me da errore qui: dim=lettura_parole (file, parole);

  • @lucia1060
    @lucia1060 11 лет назад

    e poi il ciclo for...perchè i

    • @carmhack
      @carmhack  11 лет назад

      Dim è la dimensione del vettore (ovvero il numero di elemento inseriti all'interno). I cicli for successivi scorreranno tutti da 0 a dim, tramite l'utilizzo di una variabile (i, in questo caso), così da poter accedere agli i-esimi elementi del vettore :)

  • @carmhack
    @carmhack  11 лет назад

    Non so se si può fare una cosa del genere in C, non credo comunque..

  • @rapperitaliano97
    @rapperitaliano97 10 лет назад

    Ottimo tutorial, ma come faccio a stampare un intera frase invece che parole singole?

    • @carmhack
      @carmhack  10 лет назад

      Se vai più avanti coi tutorial, lo spiego ;)

    • @rapperitaliano97
      @rapperitaliano97 10 лет назад

      TheCarmhack non trovo nulla D:

    • @carmhack
      @carmhack  10 лет назад

      Fgets(stringa, dimensione, stdin).. se non sbaglio :)

  • @carmhack
    @carmhack  12 лет назад

    Si ferma al carattere di newline -
    -. Però legge gli spazi.

  • @felicetortorelli136
    @felicetortorelli136 9 лет назад +1

    sbaglio oppure ho visto una persona entrare dalla finestra??

    • @carmhack
      @carmhack  9 лет назад

      +Felice tortorelli Non sbagli! ahahah

    • @felicetortorelli136
      @felicetortorelli136 9 лет назад

      +Carmhack - Programming & Videogame hahahaha le cose strane

    • @felicetortorelli136
      @felicetortorelli136 9 лет назад +1

      +Carmhack - Programming & Videogame vorrei darti un consiglio (nel caso tu volessi fare altri tutorial ) , approfondisci un pò di più gli argomenti che tratti, (sei bravo a spiegare, non voglio dire il contrario) perchè ci sono persone che pur essendo interessate a questo linguaggio di alto livello sono un pò lente nel comprendere

  • @WesDrake94
    @WesDrake94 11 лет назад

    Se ho un file di testo di questo tipo:
    N Città1 Stato1 Città2 Stato2 ... CittàN StatoN
    Dove N è il numero di città che vi sono nel file (che teoricamente non so), Città è il nome della città e stato il nome dello stato in cui si trova, Come faccio, leggendo N, ad immagazzinare tutti i nomi delle città in un vettore e tutti i nomi degli stati in un altro? Ci sto provando in tutti i modi ma non ci riesco!

    • @carmhack
      @carmhack  11 лет назад

      Prova con una cosa di questo tipo:
      void lettura(char citta[], char stati[]) {
      FILE *f;
      int i, dim;
      f = fopen(file, "r");
      if ( f != NULL) {
      fscanf(f, "%d", &dim);
      for(i=0; i

    • @WesDrake94
      @WesDrake94 11 лет назад

      Le parole sono tutte in riga, città stato città stato città stato ecc...
      Io ho fatto così
      int n, i;
      char Città[30], Stato[30];
      FILE = *datiPtr;
      if((datiPtr = fopen("dati.txt", "r")) == NULL)
      {
      printf("Il file non può essere aperto
      ");
      }
      else
      {
      while( !feof(datiPtr))
      {
      fscanf(datiPtr, "%d ", &n);
      for (i = 0; i < n; i++);
      {
      fscanf(datiPtr, "%s %s ", Città[i], Stato[i]);
      }
      }
      }
      fclose(datiPtr);
      }
      Ma il mi dà warnings tutti così:
      warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat]
      Questo errore me lo dà anche in altri programmi differenti... Dove sbaglio? Faccio errori di concetto?

    • @carmhack
      @carmhack  11 лет назад

      Ti conviene scrivere diversamente sul file (in uno dei due modi che ti ho elencato sopra).

    • @WesDrake94
      @WesDrake94 11 лет назад

      L'ho fatto come il tuo, ma mi dà sempre lo stesso messaggio di warning purtroppo...

    • @carmhack
      @carmhack  11 лет назад

      Dichiari due vettori di char quando dovresti dichiarare due matrici di char.. ;)

  • @lucia1060
    @lucia1060 11 лет назад

    io non ho capito a che serve dim!!! O_o

  • @christiansoru1599
    @christiansoru1599 7 лет назад

    Non ho capito un CAZZO. :) PD

  • @Jesusmarie33
    @Jesusmarie33 8 лет назад

    salve ho provato a risolvere questo esercizio pero funziona a metaà nel senso che legge i records doppiamente
    ecco il mio codice.
    #define _CRT_SECURE_NO_WARNINGS
    #ifndef DATABASE_H
    #define DATABASE_H
    #include
    #include
    #include
    struct record {
    uint32_t size;
    uint8_t *data;
    };
    struct database {
    uint32_t num;
    struct record *recs;
    };
    extern int db_load(const char *filename, struct database *db);
    #endif
    database.c
    #include "database.h"
    int db_load(const char *filename, struct database *db){
    struct record r;
    size_t i=0;
    FILE*f;
    f=fopen(filename ,"rb");
    if(f==NULL)
    return 0;
    db->recs=NULL;
    fread(&r.size,sizeof(uint32_t),1,f);
    while(fread(&r.data,sizeof(uint8_t),1,f)==1){
    i++;
    db->recs=realloc(db->recs,(i)*sizeof(struct record));
    db->recs[i-1]=r;
    }
    db->num=i;
    r.data=malloc(db->num*sizeof(struct record));
    return 1;}
    questo è lesercizio:
    struct record {
    uint32_t size;
    uint8_t *data;
    };
    struct database {
    uint32_t num;
    struct record *recs;
    };
    e la funzione
    extern int db_load(const char *filename, struct database *db);
    È stato definito un formato binario di dati per memorizzare sequenze di
    informazioni codificate in qualsiasi modo, chiamate record. Un record è
    costituito da un campo size (intero senza segno a 32 bit codificato in little
    endian), seguito da size byte. Ogni database è costituito da uno o più record
    memorizzati uno dopo l’altro. Ad esempio il file db1.bin contiene i seguenti
    byte (rappresentati in esadecimale nel seguito):
    03 00 00 00 01 00 02 02 00 00 00 03 04 05 00 00 00 FF CC AA EE DD
    Il database contiene quindi un primo record di lunghezza 3, infatti i primi 4
    byte sono 03 00 00 00. I dati contenuti nel record sono 01 00 02.
    Poi c’è un secondo record di lunghezza 2, infatti i successivi 4 byte sono 02
    00 00 00. I dati contenuti nel record sono 03 04.
    Infine, c’è un terzo record di lunghezza 5, infatti i successivi 4 byte sono
    05 00 00 00. I dati contenuti nel record sono FF CC AA EE DD.
    La funzione db_load, deve aprire il file il cui nome viene fornito dalla
    stringa C filename e caricarne il contenuto in memoria. La funzione deve
    - Impostare il campo num della struct database puntata da db al numero di
    record presenti sul file
    - Far puntare recs ad un vettore di struct record, grande num, allocato
    dinamicamente sull’heap.
    - Ogni record del vettore avrà il campo size impostato alla lunghezza del
    record e il campo data dovrà puntare ad un vettore di byte, grande size,
    allocato dinamicamente sull’heap, contenente i dati letti da file.
    La funzione deve ritornare 1 se è riuscita ad aprire il file e a leggerne
    interamente il contenuto, 0 altrimenti. Tutti i file forniti (db1.bin,
    db2.bin, db3.bin) esistono, contengono almeno un record e non hanno errori.