web-dev-qa-db-fra.com

Comment lire à partir d'un fichier texte, caractère par caractère en C++

Je me demandais si quelqu'un pourrait m'aider à comprendre comment lire un fichier texte en C++, caractère par caractère. De cette façon, je pourrais avoir une boucle while (tant qu’il reste du texte) dans laquelle je stocke le caractère suivant dans le document texte dans une variable temporaire afin que je puisse en faire quelque chose, puis répéter le processus avec le caractère suivant. Je sais comment ouvrir le fichier et tout le reste, mais temp = textFile.getchar() ne semble pas fonctionner. Merci d'avance.

11
Toby

Vous pouvez essayer quelque chose comme:

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

@cnicutar et @ Peter Becker ont déjà signalé la possibilité d'utiliser noskipws/unsetting skipws pour lire un caractère à la fois sans ignorer les caractères d'espacement dans l'entrée.

Une autre possibilité serait d'utiliser un istreambuf_iterator pour lire les données. Parallèlement, j'utilisais généralement un algorithme standard tel que std::transform pour la lecture et le traitement.

Par exemple, supposons que nous voulions faire un chiffrement de type César, copier d’entrée standard en sortie standard, mais en ajoutant 3 à chaque caractère majuscule, afin que A devienne D, B deviendrait E, etc. (et à En fin de compte, cela ferait le tour afin que XYZ soit converti en ABC.

Si nous allions le faire en C, nous utiliserions généralement une boucle comme ceci:

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

Pour faire la même chose en C++, j'écrirais probablement le code plutôt:

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

En effectuant le travail de cette manière, vous recevez les caractères consécutifs sous forme de valeurs du paramètre passé à (dans ce cas) la fonction lambda (bien que vous puissiez utiliser un foncteur explicite à la place d'un lambda si vous préférez).

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

Pour citer Bjarne Stroustrup: "L’opérateur >> est destiné à la saisie formatée, c’est-à-dire à la lecture d’objets de type et de format attendus. Lorsque cela n’est pas souhaitable et que nous souhaitons lire les caractères sous forme de () les fonctions."

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

Re: textFile.getch(), avez-vous inventé cela, ou avez-vous une référence qui dit que cela devrait fonctionner? Si c'est le dernier cas, éliminez-le. Si c'est l'ancien, ne fais pas ça. Obtenez une bonne référence.

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

Il n'y a aucune raison de ne pas utiliser C <stdio.h> en C++, et en fait c'est souvent le choix optimal.

#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

Voici une fonction élégante c ++ que vous pouvez utiliser pour lire les fichiers caractère par caractère.

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

En supposant que temp est une char et textFile est un dérivé de std::fstream ...

La syntaxe que vous recherchez est

textFile.get( temp );
0
Drew Dormann