Hoe groepen gehele getallen uit een bestand, regel per regel in C++

Ik heb een tekstbestand met op elke regel een of meer gehele getallen, gescheiden door een ruimte. Hoe kan ik dit op een elegante manier lezen met C++? Als ik het niet om de lijnen zou geven die ik kan gebruiken CIN & GT; & GT;, maar het doet erop aan welke lijn-gehele getallen zijn.

Voorbeeldinvoer:

1213 153 15 155
84 866 89 48
12
12 12 58
12

Antwoord 1, Autoriteit 100%

Het hangt ervan af of u het in lijnbasis of als een volledige set wilt doen. Voor het hele bestand in een vector van gehele getallen:

int main() {
   std::vector<int> v( std::istream_iterator<int>(std::cin), 
                       std::istream_iterator<int>() );
}

Als u in een regel per regel wilt omgaan:

int main()
{
   std::string line;
   std::vector< std::vector<int> > all_integers;
   while ( getline( std::cin, line ) ) {
      std::istringstream is( line );
      all_integers.push_back( 
            std::vector<int>( std::istream_iterator<int>(is),
                              std::istream_iterator<int>() ) );
   }
}

Antwoord 2, Autoriteit 23%

Je zou zo’n dit kunnen doen (ik heb CIN gebruikt, maar je kunt elke andere bestandstream gebruiken):

string line;
while( getline( cin, line ) )
{
 istringstream iss( line );
 int number;
 while( iss >> number )
  do_smtng_with_number();
}

of:

int number;
while( cin >> number )
{
 do_smtng_with_number();
}

Antwoord 3, Autoriteit 16%

Welk resultaat wilt u? Als je alle gehele getallen in een enkele vector wilt, zou je zoiets kunnen doen:

std::ifstream input("input.txt");
std::vector<int> data(std::istream_iterator<int>(input),
                      std::istream_iterator<int>());

Dat verwijdert echter de lijnstructuur – u komt samen met de gegevens samen. Een gemakkelijke manier om de oorspronkelijke lijnstructuur te behouden is om een ​​lijn met Getline te lezen, een streekstroom initialiseert met die tekenreeks, plaats vervolgens de waarden van die strengstroom in een vector (en duw dat op de achterkant van een vector van vectoren van INT).

std::vector<std::vector<int> > data;
std::vector<int> temp;
std::string t;
while (std::getline(input, t)) {
    std::istringstream in(t);
    std::copy(std::istream_iterator<int>(in), 
              std::istream_iterator<int>(), 
              std::back_inserter(temp);
    data.push_back(temp);
}

Antwoord 4

Hier gaat u:

void readFromFile(string filename)
{
    string line;
    ifstream myfile(filename);
    if (myfile.is_open())
    {
         while ( getline(myfile,line) )
    {
        cout << line << '\n';
    }
        myfile.close();
  }
}
int main(int argc, char* argv)
{
    readFromFile("Input.txt");
    getchar();
    return 0;
}

Other episodes