|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Mar 2004
Città: roma
Messaggi: 12
|
[C] caratteri da file
Come si fa a contare i caratteri di una riga da un file di testo??? c'è qualke funzione??? grazie!!!
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
Codice:
char buf[1000]; int len = -1; FILE *file; file = fopen("file.txt", "r" ); if(file) { fscanf(file, "%s", buf); len = strlen(buf); } Codice:
char buf[1000]; int len = -1; FILE *file; file = fopen("file.txt", "r" ); if(file) { len = fread(buf, sizeof( buf ), sizeof( buf ), file); } Ultima modifica di ri : 09-04-2004 alle 08:18. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
fscanf si ferma al primo spazio della riga, in questo caso è meglio usare 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 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
giusto... ci sono diversi modi per fare quello che vuole comunque, tutto dipende da che razza di file sta leggendo... caratteri continui, stringhe delimitate, etc etc..
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2004
Città: Milano
Messaggi: 415
|
non puoi mettere in un ciclo while un fgetch con una variabile che si incrementa finchè non trovi lo \n?
__________________
Ho concluso con Worp, -V3G3TA-, Marco911, TheDragon81, ciociola ------------------------------------------------ Diego |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Mar 2004
Città: roma
Messaggi: 12
|
allora il problema è questo:
1) devo aprire un file di testo in lettura ( e questo è tranquillo) 2) poi devo contare i caratteri del testo del file 3) devo immagazzinare tutto ciò in una stringa, che devo però allocare dinamicamente 4) a quel punto dovrò lavorare sulla stringa, facendo delle sostituzioni... quindi se dichiaro: char *s; poi devo allocarla dinamicamente quindi: s= (char*)malloc (len*sizeof(char)); [potrei anke farlo con calloc] il punto è : len come lo prendo??? poi pensavo di usare la fgets per buttare tutto il testo sulla stringa s.... a quel punto posso lavorare sulla stringa. Spero di essere stato chiaro!!! grazie x i suggerimenti!!!! |
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: Mar 2004
Città: roma
Messaggi: 12
|
ho provato a fare quello scritto sopra, ma sinceramente non funziona.... vi posto il codice!!!
int main() {FILE *fPtr; char *s; fPtr= openFile("prova.txt","r"); s= leggitesto(fPtr); system ("PAUSE"); return 0; } FILE* openFile(char* nFile, char* modoAcc){ FILE *fPtr; fPtr= fopen("prova.txt","r"); if(fPtr==NULL) exit; else return fPtr; } char *leggitesto( FILE *fPtr){ int len=0; int c; char *s; while(c=fgetc(fPtr)!=EOF) { len++; } s=(char*)malloc (sizeof(char)*len); s= fgets (s,len,fPtr); while(*s!='\0'){ if(*s>='A' && *s<='Z') *s+=32; else if(*s>'z' || *s<'A') *s=' ' ; else if(*s>'Z' && *s<'a') *s= ' ' ; ++s; } return s; } il programma crasha.... cosa ho sbagliato??? grazie |
![]() |
![]() |
![]() |
#8 | ||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
![]() Anzitutto: così come è definita, openFile è solo un wrapper di fopen, di cui non c'è bisogno. Tanto vale sostituire: Codice:
fPtr= openFile("prova.txt","r"); Codice:
if ((fPtr=fopen("prova.txt","r"))==NULL) exit(2); Codice:
while(c=fgetc(fPtr)!=EOF) Codice:
while(c=(fgetc(fPtr)!=EOF)) Nota che, comunque, allo scopo di contare la lunghezza del file, il codice funziona; ma a questo punto, tanto vale usare: Codice:
while (fgetc(fPtr) != EOF) len++; Codice:
for (len=0; fgetc(fPtr)!=EOF; len++) ; La riga: Codice:
s=(char*)malloc (sizeof(char)*len); Inoltre, tra questa e: Codice:
s= fgets (s,len,fPtr); Codice:
rewind(fPtr); ... e tu non vuoi che questo succeda, veeero? ![]() A proposito: dal Kernighan e Ritchie: Quote:
Codice:
if (c>='A' && c<='Z') *t = c + 'a' - 'A'; Quando tu chiami fgets, lo fai con un file arrivato alla fine, per cui s vale NULL. Il crash avviene quando tenti di inizializzare la zona puntata da s, che è l'indirizzo zero e non può essere toccato. Spero di essere stato utile. Fammi sapere se riesci a far funzionare il prog!
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Mar 2004
Città: roma
Messaggi: 12
|
ciao, innanzitutto grazie per avermi risposto... vengo subito al punto:
mettendo la rewind, il prog non crasha +.... come dicevi giustamente tu, *s stava su una zona che non si poteva toccare... la openfile devo usarla x forza, sto facendo un progetto x l'uni e la prof rompe i coglioni xkè la vuole.... il fatto è ke questa funzioncina deve, oltre a leggere da file di testo, sostituire le maiuscole con le minuscole e i caratteri non alfabetici con degli spazi... io c'ho provato ma non funziona 1 ceppa... il risultato è sempre la stringa di partenza.... come posso fare??? grazie |
![]() |
![]() |
![]() |
#10 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
![]() Magari includendola nel tag "code".
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: Mar 2004
Città: roma
Messaggi: 12
|
[code] #include <iostream.h>
#include <stdlib.h> #include <stdio.h> FILE* openFile(char* , char*); char* leggitesto(FILE*) ; int main() {FILE *fPtr; char *s; fPtr= openFile("prova.txt","r"); s= leggitesto(fPtr); system ("PAUSE"); return 0; } FILE* openFile(char* nFile, char* modoAcc){ FILE *fPtr; fPtr= fopen("prova.txt","r"); if(fPtr==NULL) exit(1); else return fPtr; } char *leggitesto( FILE *fPtr){ int len=0; int c; char *s; char *t; t=s; for (len=0; fgetc(fPtr)!=EOF; len++) ; s=(char*)malloc (sizeof(char)*(len+1)); rewind(fPtr); s= fgets (s,len,fPtr); while(*s!='\0'){ if(*s>='A' && *s<='Z') *s+=32; else if(*s>'z' || *s<'A') *s=' ' ; else if(*s>'Z' && *s<'a') *s= ' ' ; ++s; } return s; } int verMin (char*testo){ while (*testo!='\0'){ if(*testo=' ' || (*testo<'a'&& *testo>'z')) testo++; else return 0; } return 1; } [\code] cos'è ke non va? grazie!!! |
![]() |
![]() |
![]() |
#12 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Codice:
fPtr = fopen(nFile,modoAcc); E infatti, se ci fai caso, leggitesto restituisce sempre una stringa vuota. Infatti, muovendo s, lo fai arrivare in fondo alla stringa. Devi lasciare fermi s, ed effettuare il ciclo su t che va da s a s+len. Inoltre, ripeto quello che ho detto nel mio primo post su questo thread: non devi usare fgets per costruire s, ma rileggere tutto il file carattere per carattere.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
|
esatto la prima deve essere fopen!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:21.