|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
[C] ..e le stringhe?!?
raga mi sto da pochissimo avvicinando al C ma già programmo in Turbo Pascal, Visual Basic 6 ed un po di .Net e di derivazione anche Delphi 7...
in tutti questi linguaggi esiste la definizione di variabile stringa:"string" ma in C questa non c'è... ora mi sta bene dichiarare le stringhe come array di caratteri MA se devo leggere un intero rigo di un file per poi analizzarlo come faccio?! Per dichiarare un'array gli devo dare una lunghezza tipo: Codice:
char Nome[14]; ma io come faccio a sapere a priori la lunghezza della riga da leggere? qualcuno mi dice la procedura che si usa in C per leggere una intera riga da file? grazie mille
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In quel modo hai dichiarato un'array caratteri di grandezza fissa. Per avere un'array di caratteri di lunghezza indeterminata, devi usare un puntatore, quindi:
Codice:
char * stringa;
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Usa fgets, con un buffer di dimensione ragionevole.
Se le tue righe possono avere dimensioni abnormi, devi cambiare tecnica (ad es. mmap), oppure leggere un byte alla volta.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
ok mettiamo che per qualche ragione io devo leggere e memorizzare in una variabile un intero file!
facciamo che il file abbia 10 righe... come si fa? potreste scrivere un po di codice?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il metodo classico è allocare un buffer grande quanto l'intero file, e leggerlo dentro. E' un metodo triviale ma poco efficiente, soprattutto se il file è grande e hai poca memoria. Meglio mappare il file nello spazio di indirizzi del processo.
Ad esempio questo programma mappa un file, e lo stampa un carattere alla volta (è per linux/unix, ma ti rende l'idea): Codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd;
struct stat st;
char *map;
int x;
if (argc<2) {
printf("%s <file>\n", argv[0]);
return -1;
}
fd = open(argv[1], O_RDONLY);
if (fd<0) {
perror("open");
return -1;
}
fstat(fd, &st);
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (map==MAP_FAILED) {
perror("mmap");
return -1;
}
close(fd);
for (x=0; x<st.st_size; ++x)
printf("%c", map[x]);
munmap(map, st.st_size);
return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
niente di meno quello che nei 3 linguaggi che conosco si fa con:
VB6: Codice:
dim variabile_destinazione as string
dim rigo_letto as string
open "c:\esempio.txt" for input as #1
while not eof(1)
input #1, rigo_letto
variabile_destinazione=variabile_destinazione+rigo_letto
wend
close #1
Codice:
Var file:text;
rigo:string;
carattere:char;
assign('c:\esempio.txt',file);
reset(file);
while not eof (file) do
begin
read(carattere,file);
rigo=rigo + carattere;
end;
si trasforma in tutto quel casino?!? non ci voglio credere non esiste un modo più semplice?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC Ultima modifica di leadergl : 19-10-2005 alle 20:14. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pompei(NA)
Messaggi: 3087
|
prova a contare quanti bytes occupa il file(in una var int)es alloca un'array di caratteri di tali dimensioni....
__________________
My Deviant-Gallery MacBook Pro 13'' Retina i5 dual-core a 2,6GHz - 8GB Ram - 256GB SSD :: iPhone 12 128GB :: iPad 7 128GB WiFi :: Apple Watch 4 (40mm) |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Codice:
FILE *f = fopen("esempio.txt", "rb");
struct stat st;
char *variabile;
stat("esempio.txt", &st);
variabile = calloc(st.st_size+1, 1);
fread(variabile, 1, st.st_size, f);
fclose(f);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
In Python:
Codice:
f = open('pippo.dat')
s = f.read()
f.close()
print s
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
Quote:
ok le cose alla buona, ma non diamogli brutti vizi
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
io non voglio le cose alla buona ma è che di C non so ancora nulla, sto imparando...e non capisco perchè si fa tutto questo casino per leggere da un file....boh....
cmq per la procedura alla buona direi: 1) aprire file in lettura 2) redimensionare spazio di memoria in cui memorizzare 3) leggere il carattere 4) ripetere le operazioni 2 e 3 finchè non finisce il rigo o il file 5) chiudere il file giusto? mentre la versione "estesa", ovvero quella fatta come si deve, che faceva nel dettaglio?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ancora non ho capito se vuoi:
1 - leggere tutto il file in memoria 2 - leggerlo per righe (potendo assumere una dimensione ragionevole per le righe) 3 - leggerlo per righe ma potendo gestire righe anche di 736823763 caratteri... Credo che con fgets, come ti ho suggerito, puoi gestire facilmente il 2. Per 1, ti ho dato due soluzioni (una elegante, l'altra non molto dissimile ai tuoi esempi). Rimane 3, che sinceramente non serve a niente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
mi interessano la 1 e la 3.
ma credo quella importante sia la 3...perchè implica un po la 1...
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Allora fai il contrario, no? Leggi (suggerirei: mappi) il file in memoria, e da lì tiri fuori le righe. Non capisco cosa c'è di difficile...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
il difficile è che al momento ho dimestichezza 0 col C e come teoria sto alla dichiarazione dei vettori....!!
è questo il difficile...quindi mentre in Pascal, Delphi o VB se succede un errore riesco subito a trovare il perchè e se non riesco a fare una cosa in un modo la faccio in un altro..beh in C questa flessibilità non la ho perchè non conosco niente del C...e nel tuo codice vedo strutture che ancora non conosco e che non hanno un riscontro visivo immediato negli altri linguaggi: Codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd;
struct stat st;
char *map;
int x;
if (argc<2) {
printf("%s <file>\n", argv[0]);
return -1;
}
fd = open(argv[1], O_RDONLY);
if (fd<0) {
perror("open");
return -1;
}
fstat(fd, &st);
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (map==MAP_FAILED) {
perror("mmap");
return -1;
}
close(fd);
for (x=0; x<st.st_size; ++x)
printf("%c", map[x]);
munmap(map, st.st_size);
return 0;
}
Codice:
struct stat st; Codice:
#include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> Codice:
fd = open(argv[1], O_RDONLY); Codice:
if (argc<2) {
printf("%s <file>\n", argv[0]);
return -1;
}
Codice:
fstat(fd, &st); map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); "fstat" a che serve? "mmap" credo copii l'intero file in memoria...boh?!? "munmap" credo elimini il file dalla memoria...boh?! come puoi vedere questi sono un sacco di punti che per uno che si avvicina al C sono un po contorti... io ho portato l'esempio degli linguaggi perchè semplicemente conoscendo le stringhe (dichiarazione comune di una variabile) e la funzione per "aprire" e "leggere" da un file si risolve tutto....mentre in C è un casino (e sinceramente nn capisco xkè un linguaggio così potente abbia un modo così contorto per leggere da file e non disponga della variabile stringa che è troppo comoda....
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
se sei sotto UNIX[linux o mac os x] basta che apri un terminale e fai: man <nome_funzione>e scopri tutto..altrimenti fai una ricerca su google per le funzioni...ora devo andare a lezione e non posso spiegarti sorry
__________________
Last.fm: My Profile / GamerTag XBL: Martcus / Flickr / deviantArt iBook 12'' / MacBook Pro 13'' / iPhone 3G 16GB Black / iPod 5G 30GB / iPod Nano 2G 4GB |
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
I linguaggi che hai portato ad esempio sono tutti linguaggi ad oggetti; forse con il c++ potresti trovarti più a tuo agio, ci sono già molti oggetti pronti che possono esserti di aiuto, ma non credere che imparare ad usarlo bene sia più facile... Non so quello che devi fare; se è per un esame, prendi la strada più semplice (fgets).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
no, io ho capito quello che cercavi di dirmi col primo algoritmo ed è quello che cercavo...nel senso, mi spiego, sapere come si legge da file non mi serve per nessun esercizio universitario o per fare qualche esame al momento...ma siccome sto seguendo il corso di Algoritmi e Strutture Dati ma sopratutto il LABORATORIO di ASD ho bisogno di conoscere il C...così mentre il prof. (x ki come me ha fatto pascal) fa una rapida descrizione delle varie cose (if, while, array..etc..) io vorrei cercare di impararlo per bene questo linguaggio...
ovvio che non mi basta un giorno o una settimana perchè ci devo prendere dimestichezza e devo capire il modo in cui il C tratta TUTTO però voglio impararlo ed ovviamente mi son fatto delle domande, la più banale era questa sui files che non mi spiegavo come leggere un file in maniera rapida e semplice (o sempliciotta) senza l'uso di una struttura "stringa" vera e propria... il mio intento era arrivare a quel codice che tu hai scritto ma che ovviamente a me in questo preciso momento dice poco per le mie scarse conoscenze di C (anzi nulle). Ovvio che adesso dovrò vedermi il trattamento/uso di Array, Matrici, Puntatori in C e questo mi aprirà la strada alle Code/Liste/Alberi ed ai Files...visto che vedo uso di puntatori...però il mio intento è farle per bene le cose quindi il tuo algoritmo è perfetto ma mi serve un po per capirlo mentre una cosa un po più alla buona (come gli altri algoritmi semplificati) mi permettono un po di prendere familiarità cmq vi ringrazio per avermi risposto, thanks
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:43.




















