Ler Int a partir de um ficheiro em C++
-
Use
while
Loop e>>
Operator para ler int do arquivo em C++ -
Use o loop
while
e o método>>
Operator combinado com o métodopush_back
para ler o int do arquivo -
Não utilizar
while
Loop eeof()
Método de leitura interna a partir de ficheiro
Este artigo explicará vários métodos C++ sobre como ler os dados int
a partir de um ficheiro.
Nos programas de exemplo seguintes, assumimos que um ficheiro de texto é chamado input.txt
, que contém números inteiros separados por espaço em múltiplas linhas. Note-se que cada código de amostra verifica se este nome de ficheiro é associado ao fluxo de ficheiro real e imprime a mensagem de falha correspondente em caso de erro.
- Conteúdo do ficheiro
input.txt
:
123 178 1289 39 90 89 267 909 23 154 377 34 974 322
Use while
Loop e >>
Operator para ler int do arquivo em C++
Este método utiliza o while
para iterar o processo até que o EOF (fim do ficheiro) seja alcançado e armazenar cada número inteiro na variável número. Depois, podemos imprimir cada número para consolar no corpo do laço.
#include <fstream>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;
int main() {
string filename("input.txt");
int number;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> number) {
cout << number << "; ";
}
cout << endl;
input_file.close();
return EXIT_SUCCESS;
}
Resultado:
123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;
Use o loop while
e o método >>
Operator combinado com o método push_back
para ler o int do arquivo
Como outra alternativa, podemos obter cada número inteiro do ficheiro, armazená-lo na variável número como no exemplo anterior, e depois empurrá-lo para o vector int
em cada iteração. Note-se que este cenário inclui outro cicli for
para imitar o sistema mais prático onde os elementos dos números vectoriais armazenados precisam de ser manipulados.
#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<int> numbers;
int number;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (input_file >> number) {
numbers.push_back(number);
}
for (const auto &i : numbers) {
cout << i << "; ";
}
cout << endl;
input_file.close();
return EXIT_SUCCESS;
}
Resultado:
123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;
Não utilizar while
Loop e eof()
Método de leitura interna a partir de ficheiro
Poder-se-ia considerar a utilização da função de membro eof()
como condição de loop while
para abordar o mesmo problema. Infelizmente, isso pode levar a uma iteração extra. Uma vez que a função eof()
só retorna verdadeiro se o eofbit
estiver definido, pode levar à iteração onde a não-inicialização é modificada. Este cenário é demonstrado pela amostra de código abaixo:
#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<int> numbers;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << filename << "'" << endl;
return EXIT_FAILURE;
}
while (!input_file.eof()) {
int tmp;
input_file >> tmp;
numbers.push_back(tmp);
}
for (const auto &i : numbers) {
cout << i << "; ";
}
cout << endl;
input_file.close();
return EXIT_SUCCESS;
}
Resultado:
123; 178; 1289; 39; 90; 89; 267; 909; 23; 154; 377; 34; 974; 322;
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