Pergunta

Nosso professor nos deu esta tarefa, onde temos um .txt arquivo com o seguinte formato:

John 23
Mary 56
Kyle 99
Gary 100
...etc. etc.

O que precisamos fazer é ler o arquivo e armazenar os nomes e pontuações em arrays paralelos.

Isso está se tornando um pouco mais desafiador para mim do que eu esperava.O que está me confundindo, ao pesquisar na pilha, são todas as diferentes bibliotecas que as pessoas usam para fazer isso.Nosso Prof só quer que usemos string, fstream, e sstream para fazer isso.

Abaixo está o que eu descobri até agora, ele compila perfeitamente, divide as pontuações dos nomes, mas as armazena no mesmo array:

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  const int SIZE = 50;
  string names[SIZE];
  int score [SIZE];
  short loop = 0;
  string line;

  ifstream inFile("winners.txt");

  if (inFile.is_open())
  {
    while(!inFile.eof())
    {
       istream& getline(inFile >> line);
       names[loop] = line;
       cout << names[loop] << endl;
       loop++;
    }
    inFile.close();
  }

  else cout << "Can't open the file" << endl;

  return 0;
}

Não estou procurando alguém para resolver meu problema de HW, só quero um empurrão na direção certa!

Foi útil?

Solução

Se você quiser ler dois coisas para cada linha de entrada, parece razoável ter dois declarações de "ler":

std::string name;
inFile >> name;

int score;
inFile >> score;

std::cout << "Read score " << score << " for name " << name << '\n';

... então você pode fazer isso repetidamente até ler o arquivo inteiro.


Editar:Depois de definir a lógica básica, você pode querer pensar no tratamento de erros.Por exemplo, qual é o comportamento apropriado para o seu programa se o arquivo de entrada não contém 50 pares de (nome, pontuação)?Como você pode alterar seu código para obter esse comportamento?

Outras dicas

Cada linha do arquivo consiste em um nome e uma pontuação separados por espaços em branco.Você está lendo cada linha, mas não a divide em partes (o nome e a partitura).

Idealmente, você usaria um vetor para isso, mas como parece que foi solicitado que você usasse arrays, ficaremos com arrays.O que você tem acima parece bom até você começar a ler as entradas.Uma maneira mais idiomática de fazer isso é usar std::getline, ou seja,

ifstream inFile( "winners.txt" );
std::string line;

while( std::getline( inFile, line )) {
  // Do work here.
}

Dentro do loop você precisa dividir a linha no espaço.Sem resolver o problema para você, sugiro que você dê uma olhada nas funções find e substr da classe string: aqui.Eles lhe darão tudo que você precisa para resolver o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top