informatica:sol:laboratorio20:esercitazionib:readnwriten
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
informatica:sol:laboratorio20:esercitazionib:readnwriten [03/05/2020 alle 07:45 (5 anni fa)] – Massimo Torquati | informatica:sol:laboratorio20:esercitazionib:readnwriten [03/05/2020 alle 10:44 (5 anni fa)] (versione attuale) – Massimo Torquati | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
===== Implementazione delle funzioni " | ===== Implementazione delle funzioni " | ||
- | (tratto da " | + | (tratto da " |
Linea 24: | Linea 24: | ||
handle a return value that’s possibly less than requested. These two functions simply | handle a return value that’s possibly less than requested. These two functions simply | ||
call read or write as many times as required to read or write the entire N bytes of | call read or write as many times as required to read or write the entire N bytes of | ||
- | data. | + | data.\\ |
+ | We call writen whenever we’re writing to one of the file types that we mentioned, | ||
+ | but we call readn only when we know ahead of time that we will be receiving a certain | ||
+ | number of bytes. Figure 14.24 shows implementations of readn and writen that we | ||
+ | will use in later examples. | ||
+ | Note that if we encounter an error and have previously read or written any data, we | ||
+ | return the amount of data transferred instead of the error. Similarly, if we reach the end | ||
+ | of file while reading, we return the number of bytes copied to the caller’s buffer if we | ||
+ | already read some data successfully and have not yet satisfied the amount requested. | ||
<code c> | <code c> | ||
ssize_t | ssize_t | ||
- | writen(int fd, void *ptr, size_t n) | + | readn(int fd, void *ptr, size_t n) { |
- | { | + | |
| | ||
| | ||
Linea 35: | Linea 42: | ||
nleft = n; | nleft = n; | ||
while (nleft > 0) { | while (nleft > 0) { | ||
- | + | | |
- | + | if (nleft == n) return -1; /* error, return -1 */ | |
+ | else break; /* error, return amount read so far */ | ||
+ | } else if (nread == 0) break; /* EOF */ | ||
+ | nleft -= nread; | ||
+ | | ||
} | } | ||
| | ||
Linea 42: | Linea 53: | ||
ssize_t | ssize_t | ||
- | readn(int fd, void *ptr, size_t n) | + | writen(int fd, void *ptr, size_t n) { |
- | { | + | size_t |
- | + | | |
+ | |||
+ | nleft = n; | ||
+ | while (nleft > 0) { | ||
+ | | ||
+ | if (nleft == n) return -1; /* error, return -1 */ | ||
+ | else break; /* error, return amount written so far */ | ||
+ | } else if (nwritten == 0) break; | ||
+ | nleft -= nwritten; | ||
+ | | ||
+ | } | ||
+ | | ||
} | } | ||
</ | </ | ||
informatica/sol/laboratorio20/esercitazionib/readnwriten.1588491950.txt.gz · Ultima modifica: 03/05/2020 alle 07:45 (5 anni fa) da Massimo Torquati