2012-09-02 20 views
10

Me preguntaba si alguien podría ayudarme a averiguar cómo leer un archivo de texto en C++, carácter por carácter. De esa forma, podría tener un ciclo while (mientras todavía hay texto) donde almaceno el siguiente caracter en el documento de texto en una variable temp para que yo pueda hacer algo con él, luego repito el proceso con el siguiente caracter. Sé cómo abrir el archivo y todo, pero temp = textFile.getchar() parece que no funciona. Gracias por adelantado.Cómo leer desde un archivo de texto, carácter por carácter en C++

Respuesta

2

Re: textFile.getch(), ¿lo inventaste o tienes una referencia que dice que debería funcionar? Si es el último, deshazte de él. Si es el primero, no hagas eso. Obtenga una buena referencia.

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

¿Esto no omite espacios? – Lalaland

+0

Sí. Es por eso que @cnicular usó 'noskipws'. Acabo de editar el mío para arreglar esto. –

25

Usted podría intentar algo como:

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

'noskipws': buen punto. –

+0

@PeteBecker Sí, me gusta porque eso es lo que hace 'C' al leer caracteres individuales. – cnicutar

0

Suponiendo que temp es una char y textFile es un derivado std::fstream ...

La sintaxis que estás buscando es

textFile.get(temp); 
1

No hay razón por la que no debe usar C <stdio.h> en C++, y de hecho a menudo es la mejor opción.

#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

Hilo viejo, etc. Pero la pregunta es "del archivo". No puede usar 'getchar' para leer de otra cosa que no sea stdin. 'getc' es lo que quieres; y deberás abrir un puntero de archivo en alguna parte. – josaphatv

3

Para citar Bjarne Stroustrup: "El operador >> está destinado para la entrada con formato, es decir, la lectura de los objetos de un tipo y formato esperado Cuando esto no es deseable y queremos leer charactes como caracteres y, a continuación. examínelos, usamos las funciones get() ".

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

@cnicutar y @Pete Becker ya han señalado la posibilidad de utilizar noskipws/desarmado skipws para leer un carácter a la vez sin saltar sobre los espacios en blanco en la entrada.

Otra posibilidad sería utilizar un istreambuf_iterator para leer los datos. Junto con esto, generalmente usaría un algoritmo estándar como std::transform para hacer la lectura y el procesamiento.

Así por ejemplo, vamos a suponer que queríamos hacer un cifrado César similar, la copia de la entrada estándar a la salida estándar, pero la adición de 3 a cada carácter en mayúsculas, por lo A se convertiría en D, B podrían convertirse en E, etc. . (y al final, sería envolver por lo XYZ convertidos a ABC

Si nos vamos a hacer que en C, que normalmente haría uso de un bucle algo como esto:.

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

para hacer lo mismo en C++, me gustaría Probablemente escribir el código de la misma familia:

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

Hacer el trabajo de esta manera, recibirá los caracteres consecutivos como los valores del parámetro que recibe (en este caso) la función lambda (aunque se puede utilizar un funtor explícita en lugar de un lambda si lo prefieres).

+1

¡Solución genial! – cnicutar

4
//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. 
1

Aquí hay una función C++ con estilo que puede usar para leer archivos char por char.

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(); 
} 
Cuestiones relacionadas