Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
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


Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Borderlands 4 vola con la nuova patch 1....
Truffe online e lavoro: per la Corte di ...
Frequenza variabile 1 - 120 Hz, LG porta...
Le 7 offerte TOP Amazon oggi: Apple, un ...
OPPO anticipa l'arrivo di diverse novit&...
Capcom e i limiti dell'uso dell'IA nei v...
La crisi delle memorie arriva anche negl...
4 TV OLED in offerta su Amazon: c'&egrav...
Jensen Huang di NVIDIA parla di DLSS 5: ...
Samsung conferma la data di lancio di nu...
Solo 649€ grazie a un coupon: questa bic...
Ridimensionamento in arrivo per OnePlus?...
Cifre da low cost ma senza esserlo: vide...
Era finito, torna l'anti MacBook Air ASU...
Modem, router e ripetitori Wi-Fi FRITZ! ...
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: 11:00.


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