RISOLTO Lettura di una stringa da file

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Utente Attivo
Messaggi
166
Reazioni
7
Punteggio
44
Salve, il quesito è leggere il numero di caratteri da file e salvare la stringa in un array di char.
Io ho fatto in questo modo:


C++:
    freopen("input.txt", "r", stdin);
   
    int N;
    cin>>N;
    fflush(stdin);

    char S[N];
    cin.getline(S,N+1,'\n');
   
    cout<<S;

Questo significa che se sul file c'è scritto:
4
Ciao
4 sarà N ovvero il numero di caratteri e Ciao la parola. Pertanto creo un array di char[N+1] così da lasciare lo spazio per il carattere terminatore.
Il problema è che non arriva proprio al getline perchè si blocca al fflush(stdin) che forse va a "cancellare" in qualche modo ciò che dovrà essere letto di seguito dal file.

L'unica soluzione che ho trovato online è questa solo che non mi è chiara dato che non conosco assert:
C++:
FILE *fr, *fw;
    int N;

    fr = fopen("input.txt", "r");
    assert(1 == fscanf(fr, "%d\n", &N));

Un altra domanda, sempre nel codice che ho trovato online, il vettore di char viene dichiarato di 5 celle in più. Lì c'è scritto che lo fa per contenere newline e null. Non basterebbe dichiararlo più grande di 2? Lo si fa per '\n' e '\0'?
Grazie delle risposte!

EDIT:
Ho trovato la soluzione all'invio a capo utilizzando un getchar() che mi elimina l'invio. Tuttavia la mia seconda domanda rimane!
 
Non mischiare C con C++. C++ ha gli oggetti di tipo std::ofstream e std::ifstream per gestire i file.
assert non è obbligatorio e si accerta a runtime che la condizione sia vera (ovvero == 0) a meno che sia definita la macro NDEBUG.

Inoltre non puoi dichiarare un vettore statico in quel modo in C++, ma devi utilizzare strutture quali std::vector
 
Ultima modifica:
Ciao, non so se conosci alcuni siti che ti forniscono un template e tu devi completarlo in base al problema
Questo è uno di quei casi ed io ho scaricato la versione cpp pertanto quella parte non è stata scritta da me. Proprio per questo ho fatto quelle domande.
Poi per quanto riguarda la dichiarazione dell'array, come mai non si può fare così
C++:
int V[N];
Ho sempre fatto così anche perché si sa la dimensione a priori.
Poi per quanto riguarda il problema dell'andata a capo ho risolto con un semplice getchar()
Non mischiare C con C++. C++ ha gli oggetti di tipo std::ofstream e std::ifstream per gestire i file.
assert non è obbligatorio e si accerta a runtime che la condizione sia vera (ovvero == 0) a meno che sia definita la macro NDEBUG.

Inoltre non puoi dichiarare un vettore statico in quel modo in C++, ma devi utilizzare strutture quali std::vector
 
Ciao, non so se conosci alcuni siti che ti forniscono un template e tu devi completarlo in base al problema
Questo è uno di quei casi ed io ho scaricato la versione cpp pertanto quella parte non è stata scritta da me. Proprio per questo ho fatto quelle domande.
Poi per quanto riguarda la dichiarazione dell'array, come mai non si può fare così
C++:
int V[N];
Ho sempre fatto così anche perché si sa la dimensione a priori.
Poi per quanto riguarda il problema dell'andata a capo ho risolto con un semplice getchar()
I VLA sono una caratteristica di C e non di C++, il cui standard non la supporta. La dimensione deve essere nota a compilazione, attraverso costanti.

Tutto ciò poteva essere semplificato con una std::string, senza bisogno di VLA e getchar()
 
Ok.
L'uso di una stringa al posto di un array di char non mi permette di manipolare i singoli caratteri però giusto?
Quindi dovrei trasformarlo in un array di char comunque oppure usare i metodi di string
I VLA sono una caratteristica di C e non di C++, il cui standard non la supporta. La dimensione deve essere nota a compilazione, attraverso costanti.

Tutto ciò poteva essere semplificato con una std::string, senza bisogno di VLA e getchar()
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top