fstream C++

OubeLa

Power Member
Tenho uma dúvida:

Como é que eu importo e exporto de/para ficheiro de texto sem saber quantos elementos lá estão?

No meu caso o ficheiro de texto é assim:

Código:
nome-preco|dia*mes/ano&turno#quantidade

Por exemplo:
Código:
peixe-3|15*12/2007&2#3

Basicamente tenho um prato com um nome, um preço, uma data de funcionamento e um turno, e a quantidade para essa data. mas e se eu quiser varias datas e turnos e quantidades?

Ou seja, imagine-se 3 datas
Código:
nome-preco|dia*mes/ano&turno#quantidade|dia*mes/ano&turno#quantidade|dia*mes/ano&turno#quantidade

Por exemplo:
Código:
peixe-3|15*12/2007&2#3|16*12/2007&1#2|17*12/2007&2#7

Como é que eu faço para ler um numero que não sei de elementos?
 
Última edição:
Tenho uma dúvida:

Como é que eu importo e exporto de/para ficheiro de texto sem saber quantos elementos lá estão?

No meu caso o ficheiro de texto é assim:

Código:
nome-preco|dia*mes/ano&turno#quantidade

Por exemplo:
Código:
peixe-3|15*12/2007&2#3

Basicamente tenho um prato com um nome, um preço, uma data de funcionamento e um turno, e a quantidade para essa data. mas e se eu quiser varias datas e turnos e quantidades?

Ou seja, imagine-se 3 datas
Código:
nome-preco|dia*mes/ano&turno#quantidade|dia*mes/ano&turno#quantidade|dia*mes/ano&turno#quantidade

Por exemplo:
Código:
peixe-3|15*12/2007&2#3|16*12/2007&1#2|17*12/2007&2#7

Como é que eu faço para ler um numero que não sei de elementos?

Se bem precebi, tens alguns caracteres no teu ficheiro que funcionam como separadores. Porque é que não fazes uma recolha selectiva a partir do teu ficheiro? Do género, recolhias a linha do ficheiro para uma string (usando cin.getline()) e depois ias varrer a tua string, eliminando caracteres que não interessam.

Por exemplo, colocavas um ciclo for(), que fazias tantas iteracções quantos caracteres tinhas na string. Depois, dentro do ciclo for(), fazias uma selecção da informação: do caracter "|" ao caracter "&" é uma data, do caracter "&" ao "#" é o turno em que está disponível, e assim sucessivamente para as restantes informações disponíveis.

Bom, espero ter-te respondido. Vou fazer uma aplicação que faça o mesmo que a tua, só para ter a certeza que a minha ideia funciona a 100%. Não te coloco é aqui o código-fonte, pois assim perderia toda a piada.

Mais para a frente aprenderás, concerteza, listas e filas. Quando aprenderes estas matérias, verás que estes programas de gestão de dados se tornam mais fáceis e mais eficientes.

Vá, cumps
 
o que eu faço é no ficheiro de texto ter tudo dividido por ";". Depois percorro o ficheiro com getlines onde leio cada linha para uma string. Depois faço um find ao 1º ";" da string e copio tudo para uma nova string para tratar e guardar nos respectivos campos. Depois de tratar esse campo apago da string e volto a procurar o 1º ";" e sempre assim... quando já sabes como é que os dados irao estar agrupados é facil!
 
No fundo o que precisas de fazer para importar os dados é definir uma linguagem e definires um analisador sintáctico. É obrigatório ter os vários campos separados por caracteres diferentes? Se fosse possível haver apenas um então tu fazias isso com uma máquina de estados de 3 ou 4 estados.

Para exportar a informação tu não precisas mais do que uma linha de cout. Tipo:

Código:
struct Datum{    // os campos numerais devem ser guardados em formatos numéricos mas não vale a pena espetar aqui conversões
string nome, preco, dia, mes, ano, turno, quantidade;
};

(...)

Datum d;
cout << d.nome << "-" << d.preco << "|" << d.dia << "*" << d.mes << "/" << ano << "&" << "turno" << "#" << quantidade << endl;
(...)

Aviso: não confirmei o código. Mesmo assim deve dar para ter uma ideia.
 
o que eu faço é no ficheiro de texto ter tudo dividido por ";". Depois percorro o ficheiro com getlines onde leio cada linha para uma string. Depois faço um find ao 1º ";" da string e copio tudo para uma nova string para tratar e guardar nos respectivos campos. Depois de tratar esse campo apago da string e volto a procurar o 1º ";" e sempre assim... quando já sabes como é que os dados irao estar agrupados é facil!

Exactamente, foi o que eu disse no meu post. Mesmo tendo caracteres separadores diferentes, desde que o sir_atmc saiba o que cada um separa, é numa boa.

Vá, cumps
 
No fundo o que precisas de fazer para importar os dados é definir uma linguagem e definires um analisador sintáctico. É obrigatório ter os vários campos separados por caracteres diferentes? Se fosse possível haver apenas um então tu fazias isso com uma máquina de estados de 3 ou 4 estados.

Para exportar a informação tu não precisas mais do que uma linha de cout. Tipo:

Código:
struct Datum{    // os campos numerais devem ser guardados em formatos numéricos mas não vale a pena espetar aqui conversões
string nome, preco, dia, mes, ano, turno, quantidade;
};
 
(...)
 
Datum d;
cout << d.nome << "-" << d.preco << "|" << d.dia << "*" << d.mes << "/" << ano << "&" << "turno" << "#" << quantidade << endl;
(...)

Aviso: não confirmei o código. Mesmo assim deve dar para ter uma ideia.

Se se souber classes, pelo menos na minha opinião, é preferível usá-las em vez de structs. Mas tudo bem, para programas mais simples como este, as structs são sempre bem-vindas.

Vá, cumps
 
Back
Topo