RISOLTO Lettura di una stringa da file

Stato
Discussione chiusa ad ulteriori risposte.

Alessandro001

Nuovo Utente
141
6
Hardware Utente
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
Hard Disk
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
Scheda Video
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
Alimentatore
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Internet
https://www.speedtest.net/result/8773872068.png
Sistema Operativo
Windows 10
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!
 

_Achille

Utente Èlite
3,011
694
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
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:

Alessandro001

Nuovo Utente
141
6
Hardware Utente
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
Hard Disk
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
Scheda Video
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
Alimentatore
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Internet
https://www.speedtest.net/result/8773872068.png
Sistema Operativo
Windows 10
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
 

_Achille

Utente Èlite
3,011
694
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
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()
 

Alessandro001

Nuovo Utente
141
6
Hardware Utente
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
Hard Disk
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
Scheda Video
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
Alimentatore
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Internet
https://www.speedtest.net/result/8773872068.png
Sistema Operativo
Windows 10
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.

Entra

oppure Accedi utilizzando