Ler dados numéricos de um arquivo de texto em C ++

Por exemplo, se os dados em um arquivo de texto externo forem assim:

45.78 67.90 87 34.89 346 0.98 

Como posso ler este arquivo de texto e atribuir cada número a uma variável em c ++? Usando ifstream, eu posso abrir o arquivo de texto e atribuir o primeiro número a uma variável, mas não sei como ler o próximo número depois dos espaços.

 #include  #include  using namespace std; int main() { float a; ifstream myfile; myfile.open("data.txt"); myfile >> a; cout << a; myfile.close(); system("pause"); return 0; } #include  #include  using namespace std; int main() { int data[6], a, b, c, d, e, f; ifstream myfile; myfile.open("a.txt"); for(int i = 0; i <> data[i]; myfile.close(); a = data[0]; b = data[1]; c = data[2]; d = data[3]; e = data[4]; f = data[5]; cout << a << "\t" << b << "\t" << c << "\t" << d << "\t" << e << "\t" << f << "\n"; system("pause"); return 0; } 

Repetir >> lê em loop.

 #include  #include  int main(int argc, char * argv[]) { std::fstream myfile("D:\\data.txt", std::ios_base::in); float a; while (myfile >> a) { printf("%f ", a); } getchar(); return 0; } 

Resultado:

45.779999 67.900002 87.000000 34.889999 346.000000 0.980000

Se você sabe exatamente quantos elementos existem em um arquivo, você pode encadear >> operador:

 int main(int argc, char * argv[]) { std::fstream myfile("D:\\data.txt", std::ios_base::in); float a, b, c, d, e, f; myfile >> a >> b >> c >> d >> e >> f; printf("%f\t%f\t%f\t%f\t%f\t%f\n", a, b, c, d, e, f); getchar(); return 0; } 

Edit: Em resposta aos seus comentários na questão principal.

Você tem duas opções.

  • Você pode executar o código anterior em um loop (ou dois loops) e descartar um número definido de valores – por exemplo, se precisar do valor no ponto (97, 60), pule 5996 (= 60 * 100 + 96 ) valores e use o último. Isso funcionará se você estiver interessado apenas no valor especificado.
  • Você pode carregar os dados em uma matriz – como Jerry Coffin sugeriu. Ele já te deu aula muito boa, que vai resolver o problema. Como alternativa, você pode usar uma matriz simples para armazenar os dados.

Editar: Como pular valores no arquivo

Para escolher o valor 1234, use o seguinte código:

 int skipped = 1233; for (int i = 0; i < skipped; i++) { float tmp; myfile >> tmp; } myfile >> value; 

Pode depender, especialmente se o seu arquivo terá o mesmo número de itens em cada linha ou não. Se for, então você provavelmente quer uma class de matriz 2D de algum tipo, geralmente algo assim:

 class array2D { std::vector data; size_t columns; public: array2D(size_t x, size_t y) : columns(x), data(x*y) {} double &operator(size_t x, size_t y) { return data[y*columns+x]; } }; 

Observe que, conforme está escrito, isso pressupõe que você saiba o tamanho que precisará antes. Isso pode ser evitado, mas o código fica um pouco maior e mais complexo.

Em qualquer caso, para ler os números e manter a estrutura original, você normalmente lê uma linha por vez em uma string e, em seguida, usa uma string para ler os números da linha. Isso permite armazenar os dados de cada linha em uma linha separada em sua matriz.

Se você não souber o tamanho antecipadamente ou (especialmente) se linhas diferentes não contiverem o mesmo número de números:

 11 12 13 23 34 56 78 

Você pode querer usar um std::vector > . Isso impõe um pouco de sobrecarga, mas se linhas diferentes podem ter tamanhos diferentes, é uma maneira fácil de fazer o trabalho.

 std::vector > numbers; std::string temp; while (std::getline(infile, temp)) { std::istringstream buffer(temp); std::vector line((std::istream_iterator(buffer)), std::istream_iterator()); numbers.push_back(line); } 

… ou, com um compilador moderno (C ++ 11), você pode usar colchetes para a boot da line :

  std::vector line{std::istream_iterator(buffer), std::istream_iterator()}; 

O operador de input para número ignora os espaços em branco iniciais, para que você possa ler o número em um loop:

 while (myfile >> a) { // ... } 

você pode ler e escrever separadamente como os outros. Mas se você quiser escrever no mesmo, você poderia tentar com isto:

 #include  #include  using namespace std; int main() { double data[size of your data]; std::ifstream input("file.txt"); for (int i = 0; i < size of your data; i++) { input >> data[i]; std::cout<< data[i]<