Newsgroup: it.comp.programmare
Titolo: Varie C

Ciao ragazzi sono nuovo di questo ng  ed effettivamente non so se è
quello giusto per la mia richiesta
Avre la necessità di sapere qual sno le istruzini complete per leggere e
scrivere un file di testo in c, c++, so i nomi delle funzioni
fread,fwrite,fget, etc... Ma come si legge un file di testo sicchè il
prg si fermi alla fine della righa? stessa cosa per scriverlo??
Se ho sbagliato ng, non incazzatevi, ma ditemi se lo conoscete qualcosa
di più adatto
Grazie Mille
Enrico

prg si fermi alla fine della righa? stessa cosa per scriverlo??
Usi fgets() per leggerlo e fprintf() per scriverlo.
Leonardo
".signature": bad command or file name

fwrite 
Dato che l'fwrite SCRIVE ("to write" = "scrivere"), permettimi di dubitarne :-)
#include <stdio.h>
#include <string.h>
#define P "test.txt"
char *leggiriga(FILE *fp)
{
	char *crlf;
	static char buffer[200];
	buffer[0]=
	buffer[sizeof(buffer)-1]=0;
	fgets(buffer, sizeof(buffer), fp);
	if (*buffer == 0)
		return NULL;	/* Fine file */
	if (buffer[sizeof(buffer)-1])
		return "ERRORE! RIGA TROPPO LUNGA!";
	if ((crlf = strchr(buffer, '\n'))!=NULL) *crlf = 0;
	return buffer;
}
int main()
{
	FILE *fp;
	char *riga;
	if ((fp = fopen(P, "r"))==NULL)
	{
		/* Il file non esiste o non si puo' leggere */
		if ((fp = fopen(P, "w"))==NULL)
		{
			/* File protetto o permessi insufficienti */
			fprintf(stderr, "Impossibile aprire il file %s\n", P);
			return -1;
		}
		/* File aperto, scriviamoci qualcosa */
		fprintf(fp, "Questa è la prima riga del file\n");
		fprintf(fp, "Questa è la seconda riga\n");
		fprintf(fp, "Questa è la terza riga\nE questa è la quarta.\n");
		fclose(fp);
		printf("OK, file scritto.\n");
		return 0;
	}
	/* Se siamo arrivati qui, il file esiste ed e' leggibile */
	for (riga = leggiriga(fp); riga; riga = leggiriga(fp))
		printf("-->\"%s\"\n", riga);
	fclose(fp);
	return 0;
}
+++
"get.c" 53 lines, 1129 characters written
lserni@belfagor:/home/lserni > gcc -Wall -O2 get.c -o get
lserni@belfagor:/home/lserni > ./get
OK, file scritto.
lserni@belfagor:/home/lserni > ./get
-->"Questa è la prima riga del file"
-->"Questa è la seconda riga"
-->"Questa è la terza riga"
-->"E questa è la quarta."
lserni@belfagor:/home/lserni >


Grazie mille, mi ero sbagliato a scrivere, era con fread che ero riuscito a leggere
anzichè che con fgets, come qualcuno mi ha suggerito
Enrico
Leonardo Serni ha scritto:


Ciao di nuovo,
ho guardato la tua routine molto velocemente, però ho notato che non fai nessun
controllo sul terminatore di righa, ma un semplice controllo sulla lunghezza del
buffer, però in questo modo hai il limite della lunghezza del buffer. Per il momento
comunque va più che bene!
Enrico Dondi
Enrico ha scritto:


buffer, però in questo modo hai il limite della lunghezza del buffer. 
Non conosco metodi alternativi che non diano uno di questi due esiti:
	a) Un rallentamento micidiale
	b) Un'apocalisse nucleare ;-)
Puoi forse fare di meglio cosi':
#define CHUNK 32 
char *leggiriga(FILE *fp)
{
	static size_t buflen = 4;
	static char *buffer = NULL;
	char *crlf;
	if (buffer==NULL)
	{
		if ((buffer = malloc(buflen+1))==NULL)
		{
			fprintf(stderr, 
				"Out of memory allocating %u bytes\n", 
				buflen);
			abort();
		}
	}
	buffer[0]=
	buffer[buflen-1]=0;
	fgets(buffer, buflen+1, fp); /* Read at most buflen bytes */
	while (buffer[buflen-1]!=0)
	{
		/* Buffer overflow! */
		char	*newbuf;
		size_t newlen;
		newlen = buflen+CHUNK;
		/* Controllo antisfiga */
		if (buffer[buflen-1]=='\n')
		{
			buffer[buflen-1]=0;
			return buffer;
		}
 
		if (newlen < buflen)
		{
			fprintf(stderr, "1<< wrapped in leggiriga()\n");
			abort();
		}
		if ((newbuf = malloc(newlen+1))==NULL)
		{
			fprintf(stderr, "Out of memory realloc'ing %u bytes",
				newlen);
			abort();
		}
		memcpy(newbuf, buffer, buflen);
		free(buffer);
		buffer = newbuf;
		buffer[newlen-1] = 0;
		fgets(buffer+buflen, newlen+1-buflen, fp);
		buflen = newlen;
	}
        if (*buffer == 0)
                return NULL;    /* Fine file */
	if ((crlf = strchr(buffer, '\n'))!=NULL)
		*crlf = 0;
	return buffer;
}
Questo sul mio PC da' per risultato:
-->"Questa è la prima riga del file"
-->"Questa è la seconda riga"
-->"Questa è la terza riga"
-->"E questa è la quarta."
-->"Questa è la quinta riga, che può essere letta solo grazie all'allocazione
dinamica del buffer (tra parentesi, il newsreader la leggera' andando a capo,
almeno spero, perche' altrimenti ci sara' chi si lamenta di una riga di
lunghezza assolutamente assurda, vieppiu' allungata da citazioni casuali come
"Quel ramo del lago di Como che volge a mezzogiorno fra due catene non
interrotte di monti viene d'un tratto a dividersi e a prender corso e figura di
fiume..." (poi non la so piu') (benedetto il vi perche' ti ricorda di chiudere
le parentesi))... dov'ero rimasto? Ah si', dovremmo essere all'incirca verso la
fine del primo kilobyte di testo in una sola riga consecutiva..."
Nota bene: tu lamentati che occupa memoria e/o e' lenta, ed io ti ammazzo :-)


 wrote:
