|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
[C] problema read e write
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? Ultima modifica di *MATRIX* : 19-04-2008 alle 11:00. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
No assolutamente ..... non ti è chiaro l'I/O.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
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? Ultima modifica di *MATRIX* : 19-04-2008 alle 11:35. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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à.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
Quote:
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); Ultima modifica di *MATRIX* : 19-04-2008 alle 12:24. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
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 Ultima modifica di *MATRIX* : 21-04-2008 alle 13:48. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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(). Codice:
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' Più chiaro ora?? Non dirmi che non è chiaro perché sennò mi va tutto di traverso che ho appena mangiato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 21-04-2008 alle 14:18. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 439
|
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:40.




















