web-dev-qa-db-de.com

So lesen Sie aus einer Textdatei Zeichen für Zeichen in C++

Ich habe mich gefragt, ob jemand mir helfen könnte, aus einer Textdatei in C++ Zeichen für Zeichen zu lesen. Auf diese Weise könnte ich eine while-Schleife haben (solange noch Text vorhanden ist), in der ich das nächste Zeichen im Textdokument in einer temporären Variablen speichern kann, um etwas damit zu tun, und dann den Vorgang mit dem nächsten Zeichen wiederholen. Ich weiß, wie man die Datei und alles öffnet, aber temp = textFile.getchar() scheint nicht zu funktionieren. Danke im Voraus.

11
Toby

Sie könnten so etwas versuchen:

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

@cnicutar und @Pete Becker haben bereits auf die Möglichkeit hingewiesen, mit noskipws/skipws ein Zeichen gleichzeitig zu lesen, ohne Leerzeichen in der Eingabe zu überspringen.

Eine andere Möglichkeit wäre, einen istreambuf_iterator zum Lesen der Daten zu verwenden. Zusammen mit diesem würde ich im Allgemeinen einen Standardalgorithmus wie std::transform verwenden, um das Lesen und Verarbeiten durchzuführen.

Nehmen wir beispielsweise an, wir wollten eine Caesar-ähnliche Chiffre ausführen, indem sie von der Standardeingabe zur Standardausgabe kopierten, aber zu jedem Großbuchstaben 3 addierten, sodass AD würde, BE usw. Am Ende würde es umfließen und XYZ in ABC konvertiert werden.

Wenn wir das in C machen würden, würden wir normalerweise eine Schleife wie die folgende verwenden:

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

Um das gleiche in C++ zu tun, würde ich den Code wahrscheinlich wie folgt schreiben:

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;});

Wenn Sie den Job auf diese Weise ausführen, erhalten Sie die aufeinanderfolgenden Zeichen als Werte des Parameters, der an die Lambda-Funktion übergeben wird (in diesem Fall). Sie können jedoch auch einen expliziten Funktionscode anstelle eines Lambda verwenden, wenn Sie dies vorziehen.

10
Jerry Coffin
    //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.
4
mike

Um Bjarne Stroustrup zu zitieren: "Der Operator >> ist für formatierte Eingaben gedacht, dh das Lesen von Objekten eines erwarteten Typs und Formats. Wenn dies nicht wünschenswert ist und wir Zeichen als Zeichen lesen und dann untersuchen wollen, verwenden wir das get () Funktionen. "

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

Re: textFile.getch(), hast du dir das ausgedacht oder hast du eine Referenz, die besagt, dass es funktionieren sollte? Wenn es das letztere ist, werde es los. Wenn es das erstere ist, dann mach das nicht. Bekommen Sie eine gute Referenz.

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

Es gibt keinen Grund, C <stdio.h> in C++ nicht zu verwenden. Tatsächlich ist dies oft die optimale Wahl.

#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
}
1
zwol

Hier ist eine stilvolle C++ - Funktion, mit der Sie Dateien char für Char lesen können.

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();
}
1
Dr. Jekyll

Angenommen, dass temp eine char und textFile eine std::fstream-Ableitung ist ...

Sie suchen nach der Syntax

textFile.get( temp );
0
Drew Dormann