Newsgroup: it.comp.lang.c
Titolo: C primi passi: scrivere su un file

Ciao a tutti,
sto rispolverando il C dopo anni e purtroppo ho dimenticato tutto.
Scusate la domanda sciocca ma come faccio ad aprire e leggere un file?
Io ho scritto queste semplici righe di codice:
[code]
int file;
char* fileUtenti="utenti.txt";
file=open(fileUtenti, O_WRONLY);
if(file==-1)
{
	printf("Ci sono stati errori nella apertura del file %s, errno: %d
\n", fileUtenti, errno);
}else{
	fprintf(file, "Nome: %s; Cognome: %s\n", nome, cognome);
	close(file);
}
[/code]
Purtroppo però quando provo ad aprire il file mi viene dato un errore
ed errno prende il valore 2. Perchè? Cosa sbaglio?
Inoltre in fase di compilazione mi viene dato questo warning:
warning: passing argument 1 of ‘fprintf’ makes pointer from integer
without a cast
perchè?
Grazie, ciao ciao.

 without a cast
Perché stai facendo confusione fra le funzioni di accesso ai file 
mescolando quelle POSIX (open(), read() e write()) e quelle dello 
standard ISO (fopen(), fread(), fwrite(), fprintf(), ecc...)
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 perchè?
se guardi nel manuale la funzione fprintf vedrai che  il primo
parametro
non e' un id numerico ma un puntatore.
In C esistono due classi di funzioni per accedere a file: quelle di
"basso livello" che per identificare un file usano id numerici e
quelle
di "alto livello" che usano un puntatore a una struttura FILE. Non
e' bene mescolarle tra di loro dovresti usare un solo tipo in
maniere coerente.
Io ti consiglio di usare quelle che usano un "FILE *". Si riconoscono
perche'
cominciano per 'f': hai fopen, fclose, feof, fprintf, ...
Il tuo pezzetto di codice diventerebbe qualcosa di simile:
#include <stdio.h>
...
FILE *file;
...
file = fopen( "utenti.txt", "w" );
if (file == NULL)
  // errore
else
{
  fprintf(file, "Nome: %s; Cognome: %s\n", nome, cognome);
  fclose(file);
}
ciao
Giacomo

On 20 Lug, 11:38, Giacomo Degli Esposti

Ciao a tutti,
sono riuscito a far funzionare la scrittura.
Ho utilizzato la fopen ed ora funziona.
Ora volevo provare a leggere un file riga per riga.
Ho scritto questo codice qua:
file=fopen(fileUtenti, "r");
if(file!=NULL){
	struct Persona pers;
	i=1;
	while(fscanf(file,"Nome: %s; Cognome: %s\n", pers.nome, pers.cognome)!
=EOF){
		printf("%d) Nome: %s; Cognome: %s\n", i, pers.nome, pers.cognome);
		i++;
	}
	fclose(file);
}else{
	printf("Ci sono stati errori nella apertura del file %s, errno: %d
\n", fileUtenti, strerror(errno));
}
Il file viene aperto correttamente però a runtime ci sono parecchi
problemi. In pratica vengono stampate di continuo delle righe:
9198) Nome: Salvatore_Luca;; Cognome: u
9199) Nome: Salvatore_Luca;; Cognome: u
9200) Nome: Salvatore_Luca;; Cognome: u
9201) Nome: Salvatore_Luca;; Cognome: u
9202) Nome: Salvatore_Luca;; Cognome: u
9203) Nome: Salvatore_Luca;; Cognome: u
9204) Nome: Salvatore_Luca;; Cognome: u
9205) Nome: Salvatore_Luca;; Cognome: u
9206) Nome: Salvatore_Luca;; Cognome: u
quando il file è formato solo da pochissime righe (contenuto file):
Nome: Salvatore_Luca; Cognome: Pippo
Nome: Angelo; Cognome: Poldo
Nome: paolo; Cognome: poggi
Nome: n; Cognome: N
Nome: Andrea; Cognome: Barzagli
Nome: Juri; Cognome: Gagarin
Nome: p; Cognome: p
Nome: a; Cognome: a
Nome: p; Cognome: p
Nome: n; Cognome: n
Nome: u; Cognome: u
In pratica vengono uniti il primo nome con l'ultimo cognome.
Le righe vengono inserire all'interno del file in questo modo:
FILE* file;
char* fileUtenti="utenti.txt";
file=fopen(fileUtenti, "a");
if(file!=NULL){
	do{
		struct Persona pers;
		printf("Inserisci nome e cognome separati da spazio...\n");
		scanf("%s %s", pers.nome, pers.cognome);
		printf("Nome: %s\nCognome: %s\n", pers.nome, pers.cognome);
		fprintf(file, "Nome: %s; Cognome: %s\n", pers.nome, pers.cognome);
		printf("Continuare? s/n \n");
		scanf("%s", risposta);
	}while(strcmp(risposta,"n")!=0);
	fclose(file);
	printf("File chiuso....\n");
}else{
	printf("Ci sono stati errori nella apertura del file %s, errno: %d
\n", fileUtenti, strerror(errno));
}
(Questa è la parte che prima non funzionava e che con il vostro aiuto
sono riuscito a far partire).
A cosa può essere dovuto il problema?
Un'altra domanda, dopo essere riuscito a leggere correttamente le
informazioni dal file vorrei creare un vettore (di cui ovviamente non
conosco a priori la dimensione) dove posso trovare un semplice esempio
per capire come fare?
Grazie a tutti, ciao ciao.

Piotre Ugrumov ha scritto:

sbagliato, "%s" matcha anche il punto e virgola, tant'è che te ne stampa 
due con la printf e fscanf restituisce 1 (un solo match eseguito, il 
primo %s, ma non il secondo).
Per una cosa del genere dovresti o parsare a manina (non difficile in un 
caso così) o provare ad esempio con "%[^;]", che matcha "non punto e 
virgola"


beh, su google ;D
per esempio cercando "malloc vettore di struct" si trovano delle 
spiegazioni chiare
buon lavoro