Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Sony LinkBuds Clip, gli auricolari open ...
La fibra è sempre più diff...
Arriva Vertiv CoolPhase PAM: raffreddame...
Chiamate cristalline e ANC evoluto a pre...
Adobe aggiorna Premiere e After Effects:...
AI Bundle, la novità dei driver A...
La roadster elettrica supportata da Xiao...
Netflix rivede l'offerta per Warner Bros...
Satya Nadella avverte: senza benefici co...
Anche secondo Andy Jassy, CEO di Amazon,...
Audi mostra la sua prima auto di Formula...
Evolve3 85 e 75: Jabra presenta le prime...
KIOXIA: 'il tempo degli SSD a basso cost...
Apple perde la sua posizione privilegiat...
CovertLabs lancia l'allarme: 198 app AI ...
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: 18:26.


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