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!
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.
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.
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.. :)
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
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 - 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
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!
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
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?
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.
davvero bravissimo nello spiegare, ci farò un esame grazie ai tuoi tutorial
Grazie , probabilmente vedrai altri commenti miei in futuro dato che sto imparando a programmare con i tuoi tutorial :D
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!
gran bel tutorial sei in gamba!
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.
Grazie! :) In bocca al lupo!
sei molto bravo!
Scrivi ogni volta che ne hai bisogno :) Ricordati che mi trovi anche su fb :)
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.
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.. :)
Ciao , senti : Perché al prototipo di funzione quando dichiari il secondo parametro char ,la prima dimensione la lasci libera e la seconda no ?
1:12
sfiorato incidente diplomatico
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?
Se ho capito bene : se A< = (matrice [ i ] [ j ] )
Non credo sinceramente che si possa fare anche in quel modo. Ma ci puoi provare :)
Al massimo lo puoi fare gli operatori bitwise
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
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??
a me da errore qui: dim=lettura_parole (file, parole);
e poi il ciclo for...perchè i
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 :)
Non so se si può fare una cosa del genere in C, non credo comunque..
Ottimo tutorial, ma come faccio a stampare un intera frase invece che parole singole?
Se vai più avanti coi tutorial, lo spiego ;)
TheCarmhack non trovo nulla D:
Fgets(stringa, dimensione, stdin).. se non sbaglio :)
Si ferma al carattere di newline -
-. Però legge gli spazi.
sbaglio oppure ho visto una persona entrare dalla finestra??
+Felice tortorelli Non sbagli! ahahah
+Carmhack - Programming & Videogame hahahaha le cose strane
+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
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!
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
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?
Ti conviene scrivere diversamente sul file (in uno dei due modi che ti ho elencato sopra).
L'ho fatto come il tuo, ma mi dà sempre lo stesso messaggio di warning purtroppo...
Dichiari due vettori di char quando dovresti dichiarare due matrici di char.. ;)
io non ho capito a che serve dim!!! O_o
Non ho capito un CAZZO. :) PD
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.