Pergunta

Eu estou tentando coletar informações a partir de um arquivo de texto que contém nomes de organizações (sem espaços) e inteiros flutuante. Eu quero armazenar essas informações em uma estrutura array.

O problema que estou tendo até agora está coletando as informações. Aqui está uma amostra do ficheiro de texto:

CBA 12,3 4,5 7,5 2,9 4,1

TLS 3,9 1 8,6 12,8 4,9

Eu posso ter até 128 números diferentes para cada organização, e até 200 organizações no textfile.

Isto é o que minha estrutura se parece até agora:

struct callCentre
{
char name[256];
float data[20];
};

A minha principal:

int main()
{
callCentre aCentre[10];
getdata(aCentre);
calcdata(aCentre);
printdata(aCentre);
return 0;
}

E a função getdata:

void getdata(callCentre aCentre[])
{
ifstream ins;
char dataset[20];

cout << "Enter the name of the data file: ";
cin >> dataset;

ins.open(dataset);

if(ins.good())
{
    while(ins.good())
    {
        ins >> aCentre[c].name;
        for(int i = 0; i < MAX; i++)
        {
            ins >> aCentre[c].data[i];
            if(ins == '\n')
                break;
        }
        c++;
    }
}
else
{
    cout << "Data files couldnt be found." << endl;
}
ins.close();
}

O que eu estou tentando alcançar na minha função getdata é esta: armazenar o nome da organização primeiro na estrutura, em seguida, ler cada flutuador para a matriz de dados até que o programa detectar um byte de nova linha. No entanto, até agora a minha seleção para o byte de nova linha não está funcionando.

Suponha que as variáveis ?? c e MAX estão já definidos.

Como devo ir sobre isso corretamente?

Foi útil?

Solução

char byte = ins.peek();

ou

if(ins.peek() == '\n') break;

(Edit):. Você vai querer verificar também para um EOF após seu Auge (), porque alguns arquivos podem não ter uma nova linha terminando

Eu gostaria de salientar que você pode querer considerar usando um vector<callCentre> em vez de uma matriz estático. Se o seu comprimento arquivo de entrada excede a capacidade da matriz, você vai andar em cima da pilha.

Outras dicas

O >> trata operador espaços em branco como um delimitador, e isso inclui novas linhas, por isso só come aqueles e você nunca vê-los.

Você precisa ler linhas e, em seguida, cortar as linhas de cima. O seguinte trecho de hackery ilustra a ideia básica:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string line;
    while( getline( cin, line ) ) {
        istringstream is( line );
        string cs;
        is >> cs;
        double vals[10];
        int i = 0;
        while( is >> vals[i] ) {
            i++;
        }

        cout << "CS: " << cs;
        for ( int j = 0; j < i; j++ ) {
            cout << " " << vals[j];
        }
        cout << endl;
    }
}

Gostaria de ler o arquivo, uma linha após o outro e analisar cada linha individualmente para os valores:

std::string line;
while (std::getline(ins, line)) {
  std::istringstream sline(line);
  sline >> aCentre[c].name;
  int i = 0;
  while (sline >> aCentre[c].data[i])
    i++;
  c++;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top