Ler Ficheiro Palavra por Palavra em C++

Jinku Hu 12 outubro 2023
  1. Utilize std::ifstream para ler ficheiro palavra por palavra em C++
  2. Use as funções std::ispunct e std::string::erase para analisar os símbolos de pontuação em C++
Ler Ficheiro Palavra por Palavra em C++

Este artigo demonstrará vários métodos sobre como ler um arquivo palavra por palavra em C++.

Utilize std::ifstream para ler ficheiro palavra por palavra em C++

A classe std::ifstream pode ser utilizada para conduzir fluxos baseados em arquivos de operações de entrada. Ou seja, o tipo std::ifstream é usado para fazer interface com o buffer de arquivo e operar nele usando o operador de extração. Observe que, o tipo std::fstream também é fornecido na biblioteca de E/S que é compatível com os operadores de extração (>>) e de inserção (<<).

Primeiramente, precisamos criar um objeto do tipo ifstream chamando um de seus construtores; neste caso, apenas a string do nome do arquivo é passada para a função do construtor. Uma vez que o objeto ifstream é criado, um de seus métodos - is_open deve ser chamado para verificar se a chamada foi bem sucedida e então prosseguir com a leitura do conteúdo do arquivo.

Para ler o arquivo palavra por palavra, chamamos o operador de extração no objeto ifstream. Nós o redirecionamos para a variável string, que lê automaticamente a primeira palavra antes que o primeiro caractere de espaço seja encontrado. Como precisamos ler cada palavra até o final do arquivo, inserimos a instrução de extração em uma expressão de loop while. Além disso, declaramos um vetor de strings para armazenar cada palavra em cada iteração e imprimir mais tarde com um bloco de loop 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;
}

Use as funções std::ispunct e std::string::erase para analisar os símbolos de pontuação em C++

A única desvantagem do método anterior é que ele armazena os caracteres de pontuação próximos às palavras no vector de destino. Seria melhor analisar cada palavra e depois armazená-las em um contêiner de vector. Estamos usando a função ispunct que recebe um único caractere como parâmetro int e retorna um valor inteiro diferente de zero se o caractere for pontuação; caso contrário - zero é retornado.

Observe que o comportamento da função ispunct é indefinido se o argumento fornecido não for representável como unsigned char; portanto, é recomendável converter o caractere para o tipo correspondente. No exemplo a seguir, implementamos as duas condições if simples para verificar o primeiro e o último caracteres de cada palavra. Se a pontuação for encontrada, chamamos uma função de string embutida - apagar para remover os 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

Artigo relacionado - C++ File