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
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;
Usted podría intentar algo como:
char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
cout << ch; // Or whatever
}
'noskipws': buen punto. –
@PeteBecker Sí, me gusta porque eso es lo que hace 'C' al leer caracteres individuales. – cnicutar
Suponiendo que temp
es una char
y textFile
es un derivado std::fstream
...
La sintaxis que estás buscando es
textFile.get(temp);
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
}
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
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
}
@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).
¡Solución genial! – cnicutar
//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.
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();
}
- 1. Lectura desde el archivo de texto carácter por carácter
- 2. Lectura de un archivo carácter por carácter en C
- 3. C# archivo de texto - cómo escribir el carácter EOF
- 4. Problemas de kerning al dibujar texto carácter por carácter
- 5. ¿Cómo leo la entrada carácter por carácter en Java?
- 6. cómo leer solo un carácter en el script de shell
- 7. Cómo reemplazar un carácter en el texto por jQuery
- 8. C++ teniendo cin leer un carácter de retorno
- 9. Leer valores int desde un archivo de texto en C
- 10. Importar archivo de texto como cadena de un solo carácter
- 11. Validar texto con carácter especial
- 12. bash: leer texto de una cadena de un carácter a la vez, con espacios en blanco
- 13. Comparación de dos cadenas en carácter java por carácter
- 14. ¿Cómo leer un archivo de texto en crecimiento en C++?
- 15. ¿Cómo se escriben los valores hexadecimales de un carácter en ASCII en un archivo de texto?
- 16. Cómo leer línea por línea desde un área de texto
- 17. ¿Cómo encuentro el tipo de carácter bidireccional de un carácter Unicode en C#?
- 18. cómo determinar si un carácter es un carácter chino
- 19. restringe un carácter para escribir en un cuadro de texto
- 20. Reemplazar el carácter "en C#
- 21. ¿Cómo pongo un carácter de escape (NO carácter "fugado") en una expresión regular de Ruby?
- 22. C# añadiendo un carácter en una cadena
- 23. Cómo convertir un carácter ascii en un int en C
- 24. ¿Cómo poner un carácter Unicode en XAML?
- 25. Separar una cadena por un carácter
- 26. ¿Cómo divido un NSString por cada carácter en la cadena?
- 27. carácter ilegal en ruta
- 28. BASH: Tira carácter de nueva línea de cuerda (leer línea)
- 29. Dividir en un carácter único
- 30. grupo por el primer carácter
¿Esto no omite espacios? – Lalaland
Sí. Es por eso que @cnicular usó 'noskipws'. Acabo de editar el mío para arreglar esto. –