# Lettura da file lenta (L33t H4xX0R)

**URL:** <https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189>\
**Category:** Aiuto\
**Created:** [22 Aprile 2018, 8:24pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189 "2018-04-22T20:24:13Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![a.pignanelli](https://forum.olinfo.it/user_avatar/forum.olinfo.it/a.pignanelli/32/3204_2.png) [@a.pignanelli](https://forum.olinfo.it/u/a.pignanelli)\
**Post date:** [22 Aprile 2018, 8:24pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/1 "2018-04-22T20:24:13Z")

</div>

Buongiorno. Ho giusto oggi tentato di risolvere il problema “L33t H4xX0R (password)”. Le assunzioni prevedono fino ad un massimo di 10 milioni di numeri presi da input, e fin qui, nulla di problematico. Il problema sorge quando questi numeri che devono essere letti sono di tipo Long Long. Nonostante io abbia risolto il problema totalizzando 100/100 punti, il tempo impiegato è troppo alto e non mi soddisfa, così tramite varie prove, ho scoperto che ben 3.2 di quei secondi utilizzati vengono impiegati dalla lettura da file. Ho provato infatti a sottomettere solamente questo codice, che legge da file e niente di più:

```
#include <fstream>
int N;
long long K;
long long x;
int main()
{
    std::ifstream in("input.txt");
    std::ofstream out("output.txt");

    in >> N >> K;
    for(int i=0; i<N; i++)
        in >> x;
    return 0;
}

```

Cosa sbaglio? Ho anche provato la corrispettiva lettura da file tramite fscanf, ma i risultati non cambiano. Invece, sostituendo i tipi di K e X da long long ad int, tutto avviene molto velocemente (anche se ovviamente leggerà numeri errati).

---

<div class="post-metadata">

**Author:** ![frakkiobello](https://forum.olinfo.it/user_avatar/forum.olinfo.it/frakkiobello/32/2768_2.png) [@frakkiobello](https://forum.olinfo.it/u/frakkiobello)\
**Post date:** [22 Aprile 2018, 8:51pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/2 "2018-04-22T20:51:10Z")

</div>

Non sbagli nulla, è normale. Esistono alcuni metodi come `getchar_unlocked()` e `putchar_unlocked()` che restituiscono un char preso da file in modo molto veloce, sta a te poi convertirlo.  
Sottolineo che il time limit è pensato per i metodi che hai utilizzato precedentemente.

---

<div class="post-metadata">

**Author:** ![filippos](https://forum.olinfo.it/user_avatar/forum.olinfo.it/filippos/32/103_2.png) [@filippos](https://forum.olinfo.it/u/filippos)\
**Post date:** [23 Aprile 2018, 9:12am UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/3 "2018-04-23T09:12:49Z")

</div>

Senza dover utilizzare i più scomodi `get/putchar_unlocked()`, è una buona pratica aggiungere nel tuo codice le righe `in.tie(0); in.sync_with_stdio(0);` per velocizzare l’input (a patto che tu non stia cercando di risolvere un problema interattivo in console, categoria che non penso sia presente qui sul cms).

---

<div class="post-metadata">

**Author:** ![a.pignanelli](https://forum.olinfo.it/user_avatar/forum.olinfo.it/a.pignanelli/32/3204_2.png) [@a.pignanelli](https://forum.olinfo.it/u/a.pignanelli)\
**Post date:** [23 Aprile 2018, 3:55pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/4 "2018-04-23T15:55:17Z")

</div>

Innanzitutto grazie per le risposte.

> [@filippos](#):
>
> è una buona pratica aggiungere nel tuo codice le righe in.tie(0); in.sync\_with\_stdio(0); per velocizzare l’input

Conoscevo il metodo “sync\_with\_stdio”, ma anche mettendolo non cambiava quasi nulla; buon a sapersi invece che esista anche il “tie”.

> [@frakkiobello](#):
>
> Esistono alcuni metodi come getchar\_unlocked() e putchar\_unlocked() che restituiscono un char preso da file in modo molto veloce, sta a te poi convertirlo.

Proverò anche con getchar e putchar per vederne le differenze.

> [@frakkiobello](#):
>
> Non sbagli nulla, è normale.

Se è davvero normale, allora mi rimane il dubbio: come hanno fatto le persone in classifica a metterci così pochi secondi? Ci sono due persone che in 0.7 secondi riescono a leggere da file ed eseguire l’algoritmo di risoluzione. Proverò a svolgere qualche test.

---

<div class="post-metadata">

**Author:** ![bortoz](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/b/7c8e57/32.png) [@bortoz](https://forum.olinfo.it/u/bortoz)\
**Post date:** [23 Aprile 2018, 4:57pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/5 "2018-04-23T16:57:24Z")

</div>

Per poter scalare la classifica devi essere skillato, non ci sono trucchi particolari ¯\_(ツ)_/¯

---

<div class="post-metadata">

**Author:** ![a.pignanelli](https://forum.olinfo.it/user_avatar/forum.olinfo.it/a.pignanelli/32/3204_2.png) [@a.pignanelli](https://forum.olinfo.it/u/a.pignanelli)\
**Post date:** [23 Aprile 2018, 4:58pm UTC](https://forum.olinfo.it/t/lettura-da-file-lenta-l33t-h4xx0r/5189/6 "2018-04-23T16:58:51Z")

</div>

Beh. Se la lettura da file ci mette 4 volte tanto il tempo di qualcuno in classifica, allora qualche trucco particolare esiste. E comunque sono appena entrato in classifica 😂
