Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III è la nuvoa fotocamera mirrorless pensata per chi si avvicina alla fotografia e ricerca una soluzione leggera e compatta, da avere sempre a disposizione ma che non porti a rinunce quanto a controllo dell'immagine.
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Da Las Vegas, la visione di Larry Ellison e la concretezza di Clay Magouyrk definiscono la nuova traiettoria di Oracle: portare l’intelligenza artificiale ai dati, non i dati all’intelligenza, costruendo un’infrastruttura cloud e applicativa in cui gli agenti IA diventano parte integrante dei processi aziendali, fino al cuore delle imprese europee
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Dalla precisione estrema dei componenti alla gestione digitale dei processi: come la piattaforma ServiceNow consente ad Aston Martin Aramco Formula One Team di ottimizzare risorse IT e flussi operativi in un ambiente dove ogni millesimo di secondo conta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2008, 10:58   #1
*MATRIX*
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.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
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().

Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11:32   #3
*MATRIX*
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.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11:40   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
praticamente devo scrivere la lunghezza della stringa e la stringa nel file di testo

ovvero
ciao
4
bravo
5
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à.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 12:19   #5
*MATRIX*
Senior Member
 
Iscritto dal: Aug 2005
Messaggi: 439
Quote:
Originariamente inviato da andbin Guarda i messaggi
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);

Ultima modifica di *MATRIX* : 19-04-2008 alle 12:24.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 18:27   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 13:41   #7
*MATRIX*
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.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 14:07   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da *MATRIX* Guarda i messaggi
num=(strlen(stringa));
questa istruzione restituisce un intero

se la dichiaro come array di caratteri mi da errore
Non 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().

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'
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 21-04-2008 alle 14:18.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 14:43   #9
*MATRIX*
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
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1 Micron e millisecondi: la piattaforma ServiceNow...
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Il nuovo M5 fa la differenza anche nel g...
Le AirPods ora sono in grado di rilevare...
Oggi su Amazon succede di tutto: sconti ...
'Copilot Gaming mi spiava!': le accuse d...
Mova P50 Pro Ultra, robot aspirapolvere ...
Speciale action cam: doppio sconto solo ...
Eureka J15 Ultra conquista Amazon: aspir...
Game Pass è sempre più ric...
20 milioni di utenti contro Apple: grand...
La sonda spaziale europea ESA JUICE &egr...
La capsula Orion Integrity è stat...
Intel Nova Lake: i driver Linux svelano ...
Nothing punta sulla fascia bassa: ecco c...
Redmi Watch 6 è ufficiale: si pre...
Arriva Snapdragon 6s Gen 4: l'obiettivo ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:40.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v