# Fast I/O

**URL:** <https://forum.olinfo.it/t/fast-i-o/3830>\
**Category:** Linguaggi\
**Created:** [10 Agosto 2014, 7:40am UTC](https://forum.olinfo.it/t/fast-i-o/3830 "2014-08-10T07:40:21Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![Delfad0r](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/d/22d042/32.png) [@Delfad0r](https://forum.olinfo.it/u/Delfad0r)\
**Post date:** [10 Agosto 2014, 4:46pm UTC](https://forum.olinfo.it/t/fast-i-o/3830/3 "2014-08-10T16:46:17Z")

</div>

Come già diceva Lawliet, probabilmente il modo migliore è usare getc\_unlocked (il che non esclude che ci siano metodi più veloci, ma meno facili da implementare). Il parser di interi sarebbe qualcosa del genere (usando per comodità getchar\_unlocked(), che legge da stdin):

```
int fast_read_int() {
int c, n = 0;
do c = getchar_unlocked();
while(c < ‘0’ || c > ‘9’);
do {
n = (n << 3) + (n << 1) + (c - ‘0’);
c = getchar_unlocked();
} while(c >= ‘0’ && c <= ‘9’);
return n;
}
```

(n \<\< 3) + (n \<\< 1) è solo un modo un pochino più veloce di scrivere n \* 10. Se necessario, la funzione può facilmente essere modificata per leggere anche interi negativi (basta controllare la presenza di un carattere ‘-’). Se ti interessa anche l’output veloce, non dovrebbe essere troppo difficile scrivere una funzione simile che utilizzi putchar\_unlocked (devi fare attenzione a un paio di cose, ossia che devi scrivere il numero al contrario e tenere conto degli zeri alla fine). Ma come hai giustamente detto, ormai si tende a utilizzare la lettura/scrittura da/su file sempre meno.

---

_[View the full topic](https://forum.olinfo.it/t/fast-i-o/3830)._
