Hoe te lezen uit een tekstbestand, teken voor teken in C++

Ik vroeg me af of iemand me zou kunnen helpen erachter te komen hoe ik een tekstbestand in C++ teken voor teken kan lezen. Op die manier zou ik een while-lus kunnen hebben (terwijl er nog tekst over is) waarin ik het volgende teken in het tekstdocument in een tijdelijke variabele opsla, zodat ik er iets mee kan doen, en het proces vervolgens met het volgende teken herhalen. Ik weet hoe ik het bestand en alles moet openen, maar temp = textFile.getchar()lijkt niet te werken. Bij voorbaat dank.


Antwoord 1, autoriteit 100%

Je zou iets kunnen proberen als:

char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
    cout << ch; // Or whatever
}

Antwoord 2, autoriteit 26%

@cnicutar en @Pete Becker hebben al gewezen op de mogelijkheid om noskipws/unsetting skipwste gebruiken om een teken tegelijk te lezen zonder witruimtetekens in de invoer.

Een andere mogelijkheid zou zijn om een istreambuf_iteratorte gebruiken om de gegevens te lezen. Daarnaast zou ik over het algemeen een standaardalgoritme zoals std::transformgebruiken om het lezen en verwerken te doen.

Laten we bijvoorbeeld aannemen dat we een Caesar-achtige versleuteling wilden doen, kopiëren van standaardinvoer naar standaarduitvoer, maar 3 toevoegen aan elk hoofdletter, zodat Azou worden D, Bzou Ekunnen worden, enz. (en aan het einde zou het rondlopen zodat XYZgeconverteerd wordt naar ABC.

Als we dat in C zouden doen, zouden we meestal een lus gebruiken zoals deze:

int ch;
while (EOF != (ch = getchar())) {
    if (isupper(ch)) 
        ch = ((ch - 'A') +3) % 26 + 'A';
    putchar(ch);
}

Om hetzelfde te doen in C++, zou ik waarschijnlijk de code meer als volgt schrijven:

std::transform(std::istreambuf_iterator<char>(std::cin),
               std::istreambuf_iterator<char>(),
               std::ostreambuf_iterator<char>(std::cout),
               [](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;});

Op deze manier ontvangt u de opeenvolgende tekens, zoals de waarden van de parameter doorgegeven aan (in dit geval) de Lambda-functie (hoewel u een expliciete functor zou kunnen gebruiken in plaats van een lambda als u de voorkeur hebt).


Antwoord 3, Autoriteit 17%

Om Bjarne Stroustrup te offeren: “The & GT; & GT; operator is bedoeld voor geformatteerde input; dat wil zeggen, objecten van een verwacht type en formaat lezen. Waar dit niet wenselijk is en we willen charactes als personages lezen en ze vervolgens lijden , we gebruiken de GET () -functies “.

char c;
while (input.get(c))
{
    // do something with c
}

Antwoord 4, Autoriteit 11%

   //Variables
    char END_OF_FILE = '#';
    char singleCharacter;
    //Get a character from the input file
    inFile.get(singleCharacter);
    //Read the file until it reaches #
    //When read pointer reads the # it will exit loop
    //This requires that you have a # sign as last character in your text file
    while (singleCharacter != END_OF_FILE)
    {
         cout << singleCharacter;
         inFile.get(singleCharacter);
    }
   //If you need to store each character, declare a variable and store it
   //in the while loop.

Antwoord 5, autoriteit 11%

Hier is een stijlvolle c++-functie die u kunt gebruiken om bestanden teken voor teken te lezen.

void readCharFile(string &filePath) {
    ifstream in(filePath);
    char c;
    if(in.is_open()) {
        while(in.good()) {
            in.get(c);
            // Play with the data
        }
    }
    if(!in.eof() && in.fail())
        cout << "error reading " << filePath << endl;
    in.close();
}

Antwoord 6, autoriteit 4%

Re: textFile.getch(), heb je dat verzonnen, of heb je een referentie die zegt dat het zou moeten werken? Als het het laatste is, doe het dan weg. Als het de eerste is, doe dat dan niet. Zorg voor een goede referentie.

char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;

Antwoord 7, autoriteit 2%

Ervan uitgaande dat tempeen charis en textFileeen std::fstreamafgeleide…

De syntaxis die u zoekt is

textFile.get( temp );

Antwoord 8, autoriteit 2%

Er is geen reden om C <stdio.h>niet te gebruiken in C++, en in feite is het vaak de optimale keuze.

#include <stdio.h>
int
main()  // (void) not necessary in C++
{
    int c;
    while ((c = getchar()) != EOF) {
        // do something with 'c' here
    }
    return 0; // technically not necessary in C++ but still good style
}

Other episodes