Logo Hardware.com.br
Responder
felipexp8
felipexp8 Super Participante Registrado
555 Mensagens 23 Curtidas
#3 Por felipexp8
23/04/2010 - 15:52
o arquivo é texto.txt:

minhaFrase1;valor001
minhaFrase2;valor001
meu código:


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

using std::fstream;
using std::ofstream;
using std::ifstream;
using std::ios;
using std::string;

int main()
{
ifstream is;
is.open ("texto.txt", ios::in);

return 0;
}
Eu fiz funcionar até aqui;
agora não sei o que faço

como imprimir o arquivo texto.txt na tela, com as devidas frases(strings)?
Felipe
Entre-Trópicos
Entre-Trópic... Zumbi Registrado
4.5K Mensagens 912 Curtidas
#4 Por Entre-Trópic...
23/04/2010 - 17:30
Como você está iniciando recomendo procurar textos na internet porque são "muitas" as maneiras de ler um arquivo. Como você está usando C++(OOP, Programação Orientada à Objetos) tem uma forma fácil:

http://www.cplusplus.com/doc/tutorial/files/

[code=rich]
#include
#include
#include
using namespace std;

int main () {
string line;
ifstream myfile ("example.txt"); // ifstream = padrão ios:in
if (myfile.is_open())
{
while (! myfile.eof() ) //enquanto end of file for false continua
{
getline (myfile,line); // como foi aberto em modo texto(padrão)
//e não binário(ios::bin) pega cada linha

cout << line << endl;
}
myfile.close();
}

else cout << "Unable to open file";

return 0;
}
[/code]
felipexp8
felipexp8 Super Participante Registrado
555 Mensagens 23 Curtidas
#5 Por felipexp8
23/04/2010 - 19:42
valew, eu fiz assim:


int length;
char * buffer[6];

ifstream is;
is.open ("jogadores.csv", ios::in);

is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

for(int c=0; c < 5; c++)
{

buffer[c] = new char [length];

int n = 0;

is.getline(buffer[c],120);

while(n!=length) //isso substitue o ";" para um espaço
{

n++;

if (buffer[c][n] == ';') buffer[c][n] = '\t';
}
}
allegro_message("RECODES: \nnome: \tpontos: \n%s\n%s\n%s\n%s\n%s\n", buffer[0], buffer[1], buffer[2],buffer[3],buffer[4],buffer[5]);
is.close();
eu queria pegar tudo que foi lido e juntar num único *char e depois imprimir,

neste código que fiz tem um defeito, ele lê só cinco linhas e imprime numa janela gráfica (do windows, através da biblioteca allegro.h), porém se o arquivo tiver menos de cinco linhas ele imprime espaços vazios, e seu eu quiser imprimir mais de cinco, vou ter que estufar a função allegro_messege.

será que usando sua idéia tem como otimizar meu código?
Felipe
Entre-Trópicos
Entre-Trópic... Zumbi Registrado
4.5K Mensagens 912 Curtidas
#6 Por Entre-Trópic...
24/04/2010 - 12:11
os erros que peguei no seu código:

[code=rich]
int length;
char * buffer[6];

ifstream is;
is.open ("jogadores.csv", ios::in);

is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

for(int c=0; c < 5; c++) // irá percorrer 5 linha sempre
{
buffer[c] = new char [length]; //cada "linha" terá o tamanho do arqivo!!
//lembre-se disso um dia: new char [length + 1]; +1 para o fim de uma
//string em C = '\0'
//embora nesse caso não precise

int n = 0;
is.getline(buffer[c],120);
while(n!=length) //isso substitue o ";" para um espaço
{
n++;
if (buffer[c][n] == ';') buffer[c][n] = '\t';
}
}

allegro_message("RECODES: \nnome: \tpontos: \n%s\n%s\n%s\n%s\n%s\n", buffer[0], buffer[1], buffer[2],buffer[3],buffer[4],buffer[5]);
is.close();

//falta deletar os buffer´s
for ( int i=0; i < 5; i++)
delete buffer[i];
[/code]

Eu uso o BCB por isso não tenho o alegro então usei o printf();
[code=rich]
#include
#include
#include
using namespace std;

int main () {
int length;
char * buffer;

ifstream is;
is.open ("jogadores.csv", ios::in);

is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

if (is.is_open())
{
int n = 0;
buffer = new char[length];
is.read(buffer,length);

if (length > 0)
{
while(n < length) //isso substitue o ";" para um espaço
{
n++;
if (buffer[n] == ';') buffer[n] = '\t';
}

printf("RECODES: \nnome: \t\tpontos: \n%s", buffer);
getch();
delete []buffer;
}
}
else {
printf("Arquivo não foi aberto");
getch();
}

is.close();
}
[/code]
felipexp8
felipexp8 Super Participante Registrado
555 Mensagens 23 Curtidas
#7 Por felipexp8
25/04/2010 - 19:10
Valew, eu compilei sua versão de código e funcionou bem! :-)

Contudo o programa imprimia umas caracteres malucas no final, aí eu fiz isso:


void Jogador::Ler_Recordes()
{
int length;
char * buffer;

int tamanho;

fstream is;
is.open ("jogadores.csv", ios::in);
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

if (is.is_open())
{
int n = 0;
buffer = new char[length];
is.read(buffer,length);

if (length > 0)
{
while(n < length) //isso substitue o ";" para um espaço
{
if (buffer[n] == ';') buffer[n] = '\t';
n++;
}

tamanho = strlen(buffer); //pega o tamanha atual da string (ou não)

for (int l = 0; l < 21; l++) buffer[tamanho-l] = ' '; //ele imprimia misteriosamente 21 caracteres malucas no final da string, fiz isso para removê-las ou esconder elas.

allegro_message("RECODES: \nnome: \tpontos: \n%s", buffer);

//delete []buffer; tive que remover isso porque estava dando erro de programa, e o debug indicou exatamente nesta linha

}
else
{
printf("Arquivo não foi aberto&quot;
getch();
}

is.close();
}
}
agora está funcionando muito bem;

o próximo desafio é com os arquivos binários,
Felipe
felipexp8
felipexp8 Super Participante Registrado
555 Mensagens 23 Curtidas
#8 Por felipexp8
25/04/2010 - 19:13

como faço para gravar um arquivo binário?


essa arquivo deve conter duas informações: duas variaveis int: FASE e PONTOS, só isso.

[php]

void savepoint::recuperar()
{ //obs: a classe savepoint não tem atrituos, as variaveis FASE e PONTOS são globais

fstream ArquivoBIN;

ArquivoBIN.open("Data/savedata.dat", ios::binary);

if (ArquivoBIN.is_open())
{
ArquivoBIN.write((char *)&FASE, sizeof(int));

ArquivoBIN.write((char *)&PONTOS, sizeof(int));

allegro_message("Jogo Salvo");

ArquivoBIN.close();
}

else allegro_message("Não foi possivel salvar o jogo");

}
[/php]

o problema é o seguinte: Ele não abre ou criar o arquivo, pois quando executo o programa aparece: "Não foi possivel salvar o jogo"

o que devo fazer?
Felipe
Entre-Trópicos
Entre-Trópic... Zumbi Registrado
4.5K Mensagens 912 Curtidas
#9 Por Entre-Trópic...
26/04/2010 - 10:08
Na linguagem C/C++ quem tem que cuidar da alocação de memória é você, se usou new vai ter que usar delete em algum lugar. Você tem que se guiar pelo erro do debug inicialmente.

Contudo o programa imprimia umas caracteres malucas no final, aí eu fiz isso:

Tente isso:
buffer = new char[length + 1]
is.read(buffer,length);
buffer[length] = '\0';


se fosse só para mexer no conteúdo do arquivo tudo bem, mas como é para imprimir tem que indicar o fim.

tamanho = strlen(buffer); //pega o tamanha atual da string (ou não)
buffer tem o tamanho do arquivo, strlen vai pegar o caractere '\0', se no seu arquivo tiver um valor assim ele para ali, se não tiver buummm!! erro no programa.

diretórios em C/C++ são assim "Data\\savedata.dat".
O correto é assim:

[code=rich]
if (ArquivoBIN.is_open())
{
//aqui é onde o arquivo é salvo.
//procure por fstream.bad()

}

else
allegro_message("O arquivo não foi aberto");
[/code]

Você tá criando funções para ler conteúdos de um arquivo mas não tá se preocupando em ordenar os dados para confirmar se é o que quer naquele momento, se corresponde ao estado atual e etc.

Ex: eu estou criando um programa lotérico(d_megasc.htm,..,..), cada leitura é feita por registro(linha na tabela html), como é fixo, eu seu que o primeiro campo será o concurso, o segundo a data e etc. assim fica muito mais fácil de trabalhar.
Mesmo que o registro(concurso) mude de posição, cada dado daquele registro será o mesmo, e não importa o momento em que dei um Read().
Entre-Trópicos
Entre-Trópic... Zumbi Registrado
4.5K Mensagens 912 Curtidas
#12 Por Entre-Trópic...
29/04/2010 - 09:26
Esse arquivo do anexo veio só com o .cpp, ele tem apenas duas funções e parece que não usa nenhum atributo, ou seja, você fez uma classe(objeto) para conter só 2 funções.

Te dou o conselho de fazer um programação mais "genérica" usando elementos da OOP, porque na função savepoint já tem um nome de arquivo, acho que deveria ser passado um nome de arquivo e etc. Se gasta mais tempo planejando mas depois você só faz ajustes.

Esta refazendo o meu programa de loteria justamente por porque estava tudo bagunçado e um pouco específico para cada loteria. Então refiz as classes para me retornar dados a partir de um parâmetro genérico: eu peço a classe que me retorne o Concurso do registro x, que toda loteria tem.
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal