View Full Version : [C]Files
Salve a tutti ho un problema che non riesco a risolvere:
io devo, da un programma c, aprire un file e leggere il contenuto e metterlo in una stringa:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file;
char stringa[30];
file=fopen("file.txt","r");
while(!feof(file))
{
stringa=fgets(stringa,30,file);
}
printf("%s",stringa);
getchar();
}
Solo che non funziona...non riesco a capire bene come funziona fgets, ma mi pare di aver capito che ritorna una stringa.
Qualcuno mi aiuta?
DanieleC88
23-02-2005, 18:51
Credo che bisogni prima dichiarare stringa come char * e fare un bel stringa = (char *) malloc(30), poi usare fgets e infine usare free(stringa)
ciao
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file;
char stringa[30];
file=fopen("file.txt","r");
while(!feof(file))
{
fgets(stringa,30,file);
printf("%s",stringa);
}
getchar();
}
programma per leggere un intero file di testo in una stinga:
/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
pFile = fopen ( "myfile.txt" , "rb" );
if (pFile==NULL) exit (1);
// obtain file size.
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file.
buffer = (char*) malloc (lSize);
if (buffer == NULL) exit (2);
// copy the file into the buffer.
fread (buffer,1,lSize,pFile);
// terminate
fclose (pFile);
free (buffer);
return 0;
}
http://www.cplusplus.com/ref/
per documentarti sulla libreria del c
Ringrazio entrambi, comunque mi serviva per fare un programma che, dato appunto un testo in input controllasse quante volta una certa lettera compariva.
Io ho provato a fare cosi ma non funziona :(
#include<stdio.h>
#include<stdlib.h>
#define dim 30
int main(char argc)
{
FILE *fl;
int a,b,c,d,e,f,g,h,i,l,m,n,o,p,q,r,s,t,u,v,z,k;
char string[dim];
if(argc==2)
{
printf("\nQuesto programma riceve come input un file e controllo quante volte compare in tale file una certa lettera\n");
exit(0);
}
fl=fopen("file.txt","r");
while(!feof(fl))
{
fgets(string,dim,fl);
printf("%s",string);
}
k=0;
while(k<dim-1){
if(string[k]=='a') a++;
if(string[k]=='b') b++;
if(string[k]=='c') c++;
if(string[k]=='d') d++;
if(string[k]=='e') e++;
if(string[k]=='f') f++;
if(string[k]=='g') g++;
if(string[k]=='h') h++;
if(string[k]=='i') i++;
if(string[k]=='l') l++;
if(string[k]=='m') m++;
if(string[k]=='n') n++;
if(string[k]=='o') o++;
if(string[k]=='p') p++;
if(string[k]=='q') q++;
if(string[k]=='r') r++;
if(string[k]=='s') s++;
if(string[k]=='t') t++;
if(string[k]=='u') u++;
if(string[k]=='v') v++;
if(string[k]=='z') z++;
k++;
}
printf("%c",a);
getchar();
}
AnonimoVeneziano
23-02-2005, 19:22
Hai confuso leggermente il funzionamento di FGETS.
fgets() come valore di ritorno non emette una stringa di caratteri ma un "puntatore" a una stringa , che è la stringa dove sono stati memorizzati i caratteri letti.
I caratteri letti vengono memorizzati nell'array specificato nel primo argomento che nel tuo caso (fgets(stringa,30,file) ) è proprio stringa .
A questo punto con la locuzione "stringa=fgets(stringa,30,file)" cerchi di attribuire all' identificatore dell' array stringa[] un indirizzo (che poi è ancora il suo stesso indirizzo) , ma dato che stringa[] non è stato dichiarato come puntatore , ma come array il compilatore impedisce l'assegnamento dell' indirizzo bloccando la compilazione.
Inoltre il tuo programma è sbagliato .
Quello che tu vuoi fare credo sia visualizzare l'intero contenuto del file 30 caratteri per volta, solo che hai lasciato fuori la printf() dal ciclo while , perciò quello che visualizzerai saranno solo gli ultimi 30 caratteri del file :) (a meno che questo non sia proprio quello che vuoi fare :) )
A sto punto ci sono 2 soluzioni che puoi usare , una coi puntatori e l'altra con gli array te le posto tutte e due :
PUNTATORI
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file;
char *stringa = NULL;
stringa = malloc(30*sizeof(char));
file=fopen("file.txt","r");
while(!feof(file)) {
stringa=fgets(stringa,30,file);
if(stringa != NULL)
printf("%s",stringa);
}
getchar();
}
ARRAY
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *file;
char stringa[30];
file=fopen("file.txt","r");
while(!feof(file)) {
fgets(stringa,30,file);
if(!feof(file))
printf("%s",stringa);
}
getchar();
}
Ciao
DanieleC88
23-02-2005, 19:28
Bentornato, Anonimo! È un bel po' che non ti trovo qui sul forum. :)
Insomma, avevo parzialmente ragione io, eh?
Non so come ringraziarti...mi hai chiarito un po di dubbi :D
Sai per caso dirmi qualcosa per il programma che ho postato "2 posts fa"? :D
Grazie :)
AnonimoVeneziano
24-02-2005, 14:01
Ciao :)
Beh , diciamo che più che altro l'errore non stava nell' utilizzo dell' array , ma proprio nell' utilizzo di FGETS .
Il tuo programma non funziona per alcuni dei problemi che ti ho elencato sopra ed inoltre è un po' dispersivo, tutti quegli IF sono inutili .
Ho fatto un programmino che controlla tutte le lettere quante volte sono state scritte in una stringa , spero possa esserti utile capire come funziona .
Non l'ho controllato in maniera particolare , quindi non saprei dirti se ci sono bug mostruosi oppure no :p
Ciao
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int array[58] = {0}, howmany, count;
char stringa[30] = {'\0'};
FILE *fp;
if ((fp = fopen("file.txt", "rb")) != NULL) {
while(!feof(fp)) {
howmany = fread(stringa, sizeof(char), 30, fp);
for(count=0; count<howmany;count++)
if (stringa[count] >= 65 && stringa[count]<= 122)
array[stringa[count]-65]++;
}
fclose(fp);
for(count=0; count<26; count++)
array[count] += array[count+32];
for(count=0; count<26; count++)
printf("La lettera %c è stata trovata %d volte\n", count+65, array[count]);
return 0;
}
else {
printf("Errore nell'apertura del file file.txt\n");
return 1;
}
}
PS= Se non capisci qualche passaggio ovviamente chiedi pure
Cecco BS
31-03-2005, 14:39
salve a tutti... ultimamente sto provando a smanettare col C, senza una conoscenza specifica, così per imparare qualcosa... oggi ho provato a scrivere qualche programma che operi su files... adesso sto provando da un po' a scrivere un programma che mi prenda una stringa da un file esterno, ma ho incontrato qualche problema.... facendo una ricerca mi sono imbattuto in questa discussione.... ho provato a guardare i codici postati ma ho qualche problemuccio a comprenderli a fondo...
...
...vi posto dunque il codice (come ho già detto sono un wannabe, quindi sarà sicuramente pieno di imperfezioni):
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *file;
char s[5];
file=fopen("file_scan.txt","r");
fgets(s,5,file);
printf("Nel file c'è scritto: %s",s);
return 0;
}
Innanzi tutto chiedo correzioni sul mio codice... poi ho qualche questione relativamente ai programmi postati:
1 - il ciclo while dei vostri programmi è indispensabile? Controlla che file sia diverso da eon of file, giusto?
2 - a cosa serve il getchar() alla fine del programma?
Cecco BS
31-03-2005, 14:40
scusate... doppio post...
Il tuo codice è corretto, ma ti permette di leggere al più i primi 4 caratteri del file. Il ciclo while serve proprio a iterare l'operazione di lettura finchè il file non è finito; qaundo la lettura arriva alla fine del file pFile la funzione feof(pFile) restituisce 1, cosicchè puoi iterare finchè (! feof(pFile) ), cioè finchè non è raggiunta la fine del file.
Cecco BS
31-03-2005, 18:40
ergo se non ci fosse il ciclo while il programma non saprebbe dove finire la lettura? Cioè se il file da leggere è più corto del limite dato restituirebbe un errore? (ehm... spero di essermi spiegato!)
---
lo so che legge solo i primi quattro caratteri, era una prova solo per vedere se funziona... ma non funziona!! Il programma si termina dando un errore ma il compilatore non mi restituisce nessun errore (di solito dice "errore tal dei tale alla riga xx perchè bla bla bla")...!! :confused:
Cecco BS
31-03-2005, 18:45
ah... penso di aver capito a cosa serve getchar();... io di solito uso:
system(PAUSE);
return(0);
è la stessa cosa, giusto?
Cecco BS
31-03-2005, 18:48
aspè... :D :D :D che pirla!!! Avevo sbagliato nome del file!! Nel file che ho messo nella cartella del programma non c'è l'underscore, non mi ricordavo!! Pirla!! Adesso va, grazie cmq! :D
Dunque l'errore l'hai trovato tu stesso: se il fiel non esiste il puntatore restituito da open è NULL cosicchè si genera un errore di memeria quando tenti di usarlo per leggere; è un errore che avviene a runtime, per questo il compilatore non può rilevarlo perche non è un errore di sintassi o di tipi.
Se non esegui il ciclo non sai quando devi fermarti nella lettura, in particolare non sai quanto grande è il file che stai leggendo; puoi utilizzare un array ad esempio di 100.0000 caratteri, se il file è piu corto tutto funziona e non si hanno errori, se il file è piu lungo non riuscirai a leggerlo tutto. per questo puoi seguire due strade:
1 - leggere la lunghezza del file e allocare con malloc un array grande sufficiente a contenerlo tutto;
2 - leggere un pezzo alla volta in cun ciclo fino a leggerlo tutto.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.