View Full Version : [C] problema read e write
*MATRIX*
19-04-2008, 09:58
ciao raga
devo scrivere sotto unix codice in c
utilizzo io a basso livello quindi write e read
devo scrivere in un file di testo la lunghezza di una stringa
io scrivo
read (0 , stringa, 50);
write("file.txt",strlen(stringa),50);
ma quando compilo mi da questo errore
makes pointer from integer without a cast
come posso risolvere?
inoltre ho un piccolo quesito se volessi mettere un nome mio al file di testo
posso scrivere
write(STDIN_FILENO .........
e poi quando faccio partire l'eseguibile do il nome del file a mio piacimento?
è corretto?
utilizzo io a basso livello quindi write e read
devo scrivere in un file di testo la lunghezza di una stringa
io scrivo
read (0 , stringa, 50);
write("file.txt",strlen(stringa),50);
ma quando compilo mi da questo errore
makes pointer from integer without a cast
come posso risolvere?Beh ma scusa, se usi l' I/O a basso livello si presuppone che tu sappia almeno cosa sono i "file descriptor". Il primo parametro di read()/write() non è certo un char* per il nome del file!! È un int che indica un descrittore di file. E lo ottieni ovviamente aprendo il file con una open() ... e da chiudere alla fine con una close().
inoltre ho un piccolo quesito se volessi mettere un nome mio al file di testo
posso scrivere
write(STDIN_FILENO .........
e poi quando faccio partire l'eseguibile do il nome del file a mio piacimento?
è corretto?No assolutamente ..... non ti è chiaro l'I/O.
*MATRIX*
19-04-2008, 10:32
per il secondo ho risolto
open (argv[1] .....................
mi manca solo il primo
praticamente devo scrivere la lunghezza della stringa e la stringa nel file di testo
ovvero
ciao
4
bravo
5
e così via
per la fretta ho sbagliato a scrivere scusa
volevo dire
write(file1,stringa,buffersize) -> che funziona
ora ho messo
num=strlen(stringa)
write (file1 ,&num,buffsize ) -> che non va
dove sbaglio?
praticamente devo scrivere la lunghezza della stringa e la stringa nel file di testo
ovvero
ciao
4
bravo
5Allora devi scrivere prima la lunghezza, poi la stringa.
E per la lunghezza immagino (perché in questo caso è più comodo e pratico) che tu voglia scriverla in modo binario, cioè scrivere i 4 byte che formano un int.
Quindi se tu volessi scrivere la lunghezza 4 e la stringa "ciao", nel file ci dovrebbero essere i byte:
04h 00h 00h 00h 63h 69h 61h 6Fh
Dove 63h è la 'c' ecc....
Se non è questo che devi fare o non ti è chiaro, spiega meglio la tua necessità.
*MATRIX*
19-04-2008, 11:19
Allora devi scrivere prima la lunghezza, poi la stringa.
E per la lunghezza immagino (perché in questo caso è più comodo e pratico) che tu voglia scriverla in modo binario, cioè scrivere i 4 byte che formano un int.
Quindi se tu volessi scrivere la lunghezza 4 e la stringa "ciao", nel file ci dovrebbero essere i byte:
04h 00h 00h 00h 63h 69h 61h 6Fh
Dove 63h è la 'c' ecc....
Se non è questo che devi fare o non ti è chiaro, spiega meglio la tua necessità.
no devo scrivere il numero intero
come da esempio
ciao
4
bravo
5
italia
6
mi spiego ancora meglio
inserisco la parola da tastiera e scrive la stringa e la sua lunghezza( intero) nel file txt
il mio programma funziona per la prima cosa
ma non mi inserisce la lunghezza nel testo
num=(strlen(stringa));
write(file1,stringa,50);
write(file1,&num,10);
no devo scrivere il numero intero
come da esempio
ciao
4
bravo
5
italia
6
mi spiego ancora meglio
inserisco la parola da tastiera e scrive la stringa e la sua lunghezza( intero) nel file txt
il mio programma funziona per la prima cosa
ma non mi inserisce la lunghezza nel testo
num=(strlen(stringa));
write(file1,stringa,50);
write(file1,&num,10);No .. allora non hai capito cosa fa write e non hai capito la differenza tra scrittura di dati binari e di dati testuali.
Se vuoi scrivere righe di testo allora innanzitutto la sequenza di newline la devi scrivere esplicitamente tu, non te la mette di per sé il write(). Questo è il primo punto.
Il secondo punto è che se vuoi che nel file di testo venga scritto il carattere '4' se num vale appunto 4, allora lo devi formattare tu il numero in un array di char e poi scrivere la stringa formattata usando write().
Tu stai facendo:
write(file1,&num,10);
Così stai passando l'indirizzo della variabile num (che sicuramente è un int) e stai dicendo di scrivere 10 byte prendendoli a partire dall'indirizzo appena passato.
A parte il fatto che è sbagliato, perché un int ha solo tipicamente 4 byte, quindi stai scrivendo anche qualcos'altro ... e non si sa bene cosa ci sia in memoria dopo il 4° byte del int.
Ma oltre a tutto questo tu stai facendo appunto una scrittura binaria!!!! Questo forse non ti è ancora chiaro.
Se num valesse ad esempio 123456 (1E240h in esadecimale), allora quella tua riga scriverebbe 10 byte di cui 4 sono noti (sono i 4 byte del int) più 6 ... boh?
40h E2h 01h 00h ??h ??h ??h ??h ??h ??h
Ti è chiaro ora??? Prima per cortesia chiarisciti queste questioni che sono fondamentali.
*MATRIX*
21-04-2008, 12:41
non credo di aver capito bene
num=(strlen(stringa));
questa istruzione restituisce un intero
se la dichiaro num come array di caratteri mi da errore
num=(strlen(stringa));
questa istruzione restituisce un intero
se la dichiaro come array di caratteri mi da erroreNon ha senso e non è così che devi fare.
Visto che oggi mi sento di avere molta pazienza, rispiego il tutto.
Le funzioni read() e write() semplicemente leggono/scrivono un tot di byte e basta. A queste funzioni si passa (oltre al descrittore, è chiaro) un indirizzo in memoria e un numero che indica quanti byte leggere/scrivere. Basta tutto qua.
Alla write() cosa ci sia in quel blocco di memoria non importa minimamente, lo scrive e basta. Alla read() cosa viene letto e "depositato" in memoria dal file altrettanto non importa.
Tu potresti passare l'indirizzo della variabile 'num' e indicare di scrivere 4 byte (la dimensione di un int). Tecnicamente è corretto ed è una cosa che si fa in caso di gestione ad esempio di file binari o che contengono strutture dati.
Ma così stai facendo una scrittura binaria. Stai scrivendo proprio i byte che compongono il valore della variabile.
Se vuoi scrivere un file di testo non è ovviamente l'approccio da seguire. Se num vale ad esempio 123 tu non devi scrivere i 4 byte che compongono l'int ma devi scrivere 3 caratteri '1' '2' '3'. Quindi una cosa molto ben diversa.
Quindi il numero lo devi formattare in stringa ad esempio tramite la funzione sprintf().
int num;
char str[16];
num = strlen (tua_stringa); // es. num = 123 (se tua_stringa ha 123 caratteri escluso il nullo)
sprintf (str, "%d", num); // in str hai i caratteri '1' '2' '3' '\0'
write (fd, str, strlen (str)); // scrive i 3 caratteri '1' '2' '3'
Se devi scrivere delle linee, devi anche scrivere la sequenza di newline. Questo puoi farlo con un'altra semplice write a parte o nella sprintf sopra mettendo la sequenza di newline dopo lo specificatore di formato, in modo che faccia parte della stringa da scrivere.
Più chiaro ora?? Non dirmi che non è chiaro perché sennò mi va tutto di traverso che ho appena mangiato. :D
*MATRIX*
21-04-2008, 13:43
ok ti ringrazio
ora ho capito
l'unico problemino ora e che non conta bene i caratteri sarà un problema i strlen
cmq ho capito non ero a conoscenza di sprintf mai usata
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.