Ler Ficheiro Palavra por Palavra em C++
-
Utilize
std::ifstream
para ler ficheiro palavra por palavra em C++ -
Use as funções
std::ispunct
estd::string::erase
para analisar os símbolos de pontuação 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;
}
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