Leer archivo palabra por palabra en C++
-
Utilice
std::ifstream
para leer archivos Word por Word en C++ -
Utilice las funciones
std::ispunct
ystd::string::erase
para analizar los símbolos de puntuación en C++
Este artículo demostrará varios métodos sobre cómo leer un archivo palabra por palabra en C++.
Utilice std::ifstream
para leer archivos Word por Word en C++
La clase std::ifstream
se puede utilizar para realizar operaciones de entrada en secuencias basadas en archivos. Es decir, el tipo std::ifstream
se usa para interactuar con el búfer de archivos y operar en él usando el operador de extracción. Tenga en cuenta que el tipo std::fstream
también se proporciona en la biblioteca de E/S que es compatible con los operadores de extracción (>>
) y de inserción (<<
).
Al principio, necesitamos crear un objeto de tipo ifstream
llamando a uno de sus constructores; en este caso, solo se pasa la cadena de nombre de archivo a la función constructora. Una vez que se crea el objeto ifstream
, se debe llamar a uno de sus métodos - is_open
para verificar que la llamada fue exitosa y luego proceder a leer el contenido del archivo.
Para leer el archivo palabra por palabra, llamamos al operador de extracción en el objeto ifstream
. Lo redirigimos a la variable de cadena, que lee automáticamente la primera palabra antes de que se encuentre el primer carácter de espacio. Como necesitamos leer cada palabra hasta el final del archivo, insertamos la declaración de extracción en una expresión de bucle while
. Además, declaramos un vector
de cadenas para almacenar cada palabra en cada iteración e imprimir más tarde con un bloque de bucle separado.
#include <fstream>
#include <iostream>
#include <vector>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;
using std::vector;
int main() {
string filename("input.txt");
vector<string> words;
string word;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> word) {
words.push_back(word);
}
for (const auto &i : words) {
cout << i << endl;
}
input_file.close();
return EXIT_SUCCESS;
}
Utilice las funciones std::ispunct
y std::string::erase
para analizar los símbolos de puntuación en C++
La única desventaja del método anterior es que almacena los caracteres de puntuación cerca de las palabras en el vector
de destino. Sería mejor analizar cada palabra y luego almacenarlas en un contenedor vector
. Estamos usando la función ispunct
que toma un solo carácter como parámetro int
y devuelve un valor entero distinto de cero si el carácter es puntuación; de lo contrario, se devuelve cero.
Tenga en cuenta que el comportamiento de la función ispunct
no está definido si el argumento dado no se puede representar como unsigned char
; por lo tanto, se recomienda convertir el carácter en el tipo correspondiente. En el siguiente ejemplo, implementamos las dos condiciones simples if
para verificar el primer y último carácter de cada palabra. Si se encuentra la puntuación, llamamos a una función de cadena incorporada: erase
para eliminar los caracteres encontrados.
#include <fstream>
#include <iostream>
#include <vector>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;
using std::vector;
int main() {
string filename("input.txt");
vector<string> words;
string word;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> word) {
if (ispunct(static_cast<unsigned char>(word.back())))
word.erase(word.end() - 1);
else if (ispunct(static_cast<unsigned char>(word.front())))
word.erase(word.begin());
words.push_back(word);
}
for (const auto &i : words) {
cout << i << endl;
}
input_file.close();
return EXIT_SUCCESS;
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook