Leer archivo palabra por palabra en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::ifstream para leer archivos Word por Word en C++
  2. Utilice las funciones std::ispunct y std::string::erase para analizar los símbolos de puntuación en C++
Leer archivo palabra por palabra 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;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ File