Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2008, 09: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 10:00.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 10:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 10: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 10:35.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 10:40   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 11: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 11:24.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 17:27   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 12: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 12:48.
*MATRIX* è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 13:07   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet

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


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
DAZN Full in sconto a partire da 19,99 e...
iPhone 18 Pro disponibile su Amazon a 1....
ECOVACS T90 OMNI a 439€ e T90 MAX OMNI a...
Questa Proscenic è la scopa elett...
Microsoft Defender: falso allarme sull'a...
Aerei in volo e truppe pronte all'assalt...
Usano Claude per hackerare OpenAI: ricer...
RatHat: il nuovo malware Android usa il ...
Domanda di petrolio in calo di 2,5 milio...
Il meglio delle offerte weekend Amazon a...
Dopo oltre 100 anni di tentativi, l'IA d...
Speciale robot aspirapolvere in offerta ...
L'IA sta cancellando i lavori junior? Il...
Debutta Chery Italia: non più sol...
Addio ai dischi? Xbox ci aveva già...
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: 17:12.


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