DOMANDA Gestione Di File In C++

davicos

Utente Attivo
226
11
Salve a tutti,
circa questo codice:

C++:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <iomanip>

using namespace std;

void outputLine(string &name, int eta)
{
    cout << left << setw( 10 ) << name << setw( 13 )
    << eta << setw( 7 ) << setprecision( 2 ) << right << endl;
}

int main ()
{
    string name;
    int eta;

    ifstream myfile ("example.txt");
    if (myfile.is_open())
    {
        while ( myfile >> name >> eta )     
        {                                   
          outputLine(name, eta);
        }

    myfile.close();
    }

    else cout << "Unable to open file";



    return 0;
}

ho un file con alcuni nomi con affianco l'età. Vorrei sapere come posso fare per confrontare ad esempio l'età di due persone poste in righe diverse.
Le variabili "nome" ed "eta" mi leggono le colonne dei nomi e delle età rispettivamente ma come faccio ad prendere due nomi (o anche due età) ed inserirle in altre variabili per confrontarle?

Grazie.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Nel while salvi i nomi e l'età in una mappa
 

davicos

Utente Attivo
226
11
Ho risolto diciamo a metà, nel senso che nel while ho inserito dei vettori di interi per l'età e di stringhe per i nomi.
Il problema è che se uso i vettori devo conoscere a priori quante righe sono presenti nel file.
Si può ovviare a tale inconveniente?

Grazie!
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Ho risolto diciamo a metà, nel senso che nel while ho inserito dei vettori di interi per l'età e di stringhe per i nomi.
Il problema è che se uso i vettori devo conoscere a priori quante righe sono presenti nel file.
Si può ovviare a tale inconveniente?

Grazie!
Vettori in che senso? Perché la classe vector ha il metodo push_back() che non ti richiede di sapere la dimensione e la aumenta ogni volta tu la chiami con parametro il dato da aggiungere.
 

davicos

Utente Attivo
226
11
Gli array intendo.
Il codice modificato è il seguente:

C++:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <iomanip>

using namespace std;

const int n = 2;

void outputLine(string &nome, int eta)
{
    cout << left << setw( 10 ) << nome << setw( 13 )
    << eta << setw( 7 ) << setprecision( 2 ) << right << endl;
}

int main ()
{
    string nome;
    int eta, i=0, z;

    int et[n];
    string nom[n];

    ifstream myfile ("example.txt");
    if (myfile.is_open())
    {
        while ( myfile >> nome >> eta )
        {
          outputLine(nome, eta);
          nom[i] = nome;
          et[i] = eta;


          i++;
        }

    myfile.close();
    }

    else cout << "Unable to open file";


    for(int i=0; i<2; i++)
    {
        cout << "prova: " << endl;
        cout << nom[i] << " " << et[i] << endl;
    }



    return 0;
}


la dimensione degli array è n=2 in quanto nel file.txt sono presenti due nomi con le rispettive età.
Se non conosco a priori quante righe sono presenti nel file (ergo quanti nomi ed età) gli array sono abbastanza inutilizzabili no?
Quindi come ovviare?

Grazie.

PS. del metodo che hai citato non ne so nulla. Ma se funziona..
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Usa la classe vector, come già stai usando la classe string.
Dichiara un vector<int> et e un vector<string> nom.
Poi nel while:
C++:
#include <vector>
#include <string>
using namespace std;

...
{
    vector<int> et;
    vector<string> nom;
    ...
    while(...)
    {
        ...
        et.push_back(eta);
        nom.push_back(nome);
     }
...
}

Cambia nome ai vettori però, che non hanno alcun senso
 

davicos

Utente Attivo
226
11
Ok ma come faccio ad esempio a stampare, fine lettura del file, il nome posto ad una certa riga?
Con gli array metto il numero della cella e me la stampa ma con questo metodo come faccio? Non l'ho mai usato..

Grazie!
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit

davicos

Utente Attivo
226
11
Ah ok visto. Nel link che mi avevi dato precedentemente non ero nella pagina giusta e c'era solo la descrizione.
Grazie!
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Ah ok visto. Nel link che mi avevi dato precedentemente non ero nella pagina giusta e c'era solo la descrizione.
Grazie!
Beh se è menzionato un qualsiasi operatore nella classe ovvio che si intende che quell’operatore è sovraccaricato per quel tipo/classe.
Stessa cosa vale per gli operatori di estrazione e inserimento di bit che sono dichiarati come friend solitamente
 

davicos

Utente Attivo
226
11
Non è tanto ovvio per chi queste cose ancora non le ha viste. Sono alle prime armi ancora ecco.
Comunque grazie!
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!