Jump to content

Ler parte de um arquivo e criar outro novo


matheusltr
 Share

Recommended Posts

Olá pessoal,

quero fazer um algoritmo que faca assim:

tenho que pegar um arquivo que tem escrito por exemplo: Meu nome é Matheus e sou Estudante

e tenho que pegar o nome e a profissao e depois escrever em outro arquivo, por exemplo Nome: Matheus Profissao: Estudante

mas tenho que fazer isso para quantas linhas houverem no primeiro arquivo, para cada nome

como uso as funcoes de arquivo para fazer isso?

Link to comment
Share on other sites

Sim, eu sei que tenho que usar!

O problema é como, não sei como uso a função para pegar só uma parte em algum lugar do arquivo.

Por exemplo: Meu nome é Matheus, tenho 15 anos.

Como pego só o Matheus e o 15 e depois crio outro arquivo escrevendo isso?

Mostrem exemplos por favor

Sim terás de usar.

Para tirar do ficheiro podes usar o fscanf, e para escrever fputs ou muitas outras funções que pelo C existem. Dá uma googlada que encontrarás diversos artigos, inclusive aqui no P@P tem tb tópicos sobre isso.

Link to comment
Share on other sites

É para isso que serve o scanf: desde que o input seja sempre na mesma forma (neste caso, "Meu nome é X, tenho Y anos"), podes usar essa função para fazer matching usando esse padrão.

O que tens que passar para a scanf é uma string com o padrão, em que as zonas que queres ler sejam substituídas por símbolos para ler letras/números/etc.

Exemplo: Queres ler string do tipo "Tenho um Nokia 6230 azul", "Tenho um Nokia 3249 verde", "Tenho um Nokia 7523 preto".

O que tu queres ler é um número inteiro (símbolo %d) e depois uma string com a cor (símbolo %s). Fica:

int modelo;
char cor[20];
scanf("Tenho um Nokia %d %s\n", &modelo, cor);

Os símbolos que podes usar estão na Wiki: http://wiki.portugal-a-programar.org/c:scanfparastrings

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Em arquivos usa-se o fscanf, que funciona da mesma forma:

FILE *meuarquivo = fopen("nokia.txt", "r");
int modelo;
char cor[20];
fscanf(meuarquivo, "Tenho um Nokia %d %s\n", &modelo, cor);
fclose(meuarquivo);

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

Pode usar o fgets, por exemplo, mas depois terás que andar a "fuçar" com a string, saltando partes e lendo depois caracter a caracter - na prática, implementado o scanf à mão, o que não faz sentido.

scanf -> ler do stdin (consola)

fscanf -> ler de ficheiros/arquivos

sscanf -> ler de strings (http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/)

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Agora entendi.... mas estou tentando fazer com que ela faca isso para quantas linhas houverem no arquivo, e nao estou conseguindo.

Veja no meu exemplo, qual deve ser o erro?

int main() {
   FILE *arquivo = fopen("dados.txt", "r");
   int pos_x, pos_y, pos_z;
   int dim_x, dim_y, dim_z;
   int cor_r, cor_g, cor_b;
   char c;

   while ((c = getc (arquivo)) != EOF) {
       while ((c = getc (arquivo)) != '\n') {
           fscanf(arquivo, "posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%d cor_%d cor_%d\n", &pos_x, &pos_y, &pos_z, &dim_x, &dim_y, &dim_z, &cor_r, &cor_g, &cor_b);
           printf("posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%d cor_%d cor_%d\n",pos_x, pos_y, pos_z, dim_x, dim_y, dim_z, cor_r, cor_g, cor_b);
       }
   }
   getchar();
   fclose(meuarquivo);
   return 1;
}
Link to comment
Share on other sites

O problema é que quando fazes getc(), ele vai "comer" esse caracter, o que significa que quando usas o fscanf ele já vai ler uma linha sem um ou dois caracteres.

Para verificares o fim do ficheiro podes usar a função feof(). Quanto ao segundo while, não sei se estás a pensar bem nisso: o fscanf já vai ler o '\n', não precisas de verificar com o getc: basta correres o fscanf o número de vezes que precisares até o ficheiro acabar.

int main() {
   FILE *arquivo = fopen("dados.txt", "r");
   int pos_x, pos_y, pos_z;
   int dim_x, dim_y, dim_z;
   int cor_r, cor_g, cor_b;
   char c;

   while (!feof(arquivo)) {
       fscanf(arquivo, "posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%d cor_%d cor_%d\n", &pos_x, &pos_y, &pos_z, &dim_x, &dim_y, &dim_z, &cor_r, &cor_g, &cor_b);
       printf("posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%d cor_%d cor_%d\n",pos_x, pos_y, pos_z, dim_x, dim_y, dim_z, cor_r, cor_g, cor_b);
   }
   getchar();
   fclose(meuarquivo);
   return 1;
}

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Cara muito obrigado por estar me ajudando

mas testei aqui, e fica num loop infinito

o arquivo de texto esta assim:

posicao_4 posicao_3 posicao_4 dimensao_1 dimensao_5 dimensao_3 cor_0.3 cor_0.4 cor_0.5

posicao_4 posicao_3 posicao_4 dimensao_1 dimensao_5 dimensao_3 cor_0.3 cor_0.4 cor_0.5

posicao_4 posicao_3 posicao_4 dimensao_1 dimensao_5 dimensao_3 cor_0.3 cor_0.4 cor_0.5

Link to comment
Share on other sites

Não podes usar %d para leres 0.3 - é apenas para números inteiros. Terás que usar %f para leres números decimais. Já agora, para os escreveres (no printf) também - usam os mesmo símbolos.

Ah, e não podes usar int's para guardar as cores, porque isso também é para inteiros. Terás que usar float.

Portanto, fica:

int main() {
   FILE *arquivo = fopen("dados.txt", "r");
   int pos_x, pos_y, pos_z;
   int dim_x, dim_y, dim_z;
   float cor_r, cor_g, cor_b;
   char c;

   while (!feof(arquivo)) {
       fscanf(arquivo, "posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%f cor_%f cor_%f\n", &pos_x, &pos_y, &pos_z, &dim_x, &dim_y, &dim_z, &cor_r, &cor_g, &cor_b);
       printf("posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%f cor_%f cor_%f\n",pos_x, pos_y, pos_z, dim_x, dim_y, dim_z, cor_r, cor_g, cor_b);
   }
   getchar();
   fclose(arquivo); //NOTA: tinhas aqui 'meuarquivo', é só 'arquivo'
   return 1;
}

---

Já agora, nota que ele vai escrever as cores com seis casas decimais: podes definir isso no printf.

Em vez de usares '%f', podes acrescentar a precisão (número de casas decimais) com que ele deve imprimir, usando a sintaxe %.NUMEROf.

Por exemplo, se queres imprimir com uma casa decimal, usas printf("O numero é %.1f", 3.30000);

Ele vai imprimir "3.3".

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Aquela versão tem um problema: o EOF só é detectado quando o fscanf tenta ler e já não existe nenhuma linha para ler - mas nessa versão, o printf() imprime mesmo depois de o fscanf não conseguir ler nada.

Tenta esta nova:

int main() {
   FILE *arquivo = fopen("dados.txt", "rb");
   int pos_x, pos_y, pos_z;
   int dim_x, dim_y, dim_z;
   float cor_r, cor_g, cor_b;
   char c;
   int read = 0;

   while( fscanf(arquivo, "posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%f cor_%f cor_%f\n", &pos_x, &pos_y, &pos_z, &dim_x, &dim_y, &dim_z, &cor_r, &cor_g, &cor_b) == 9) {
        printf("posicao_%d posicao_%d posicao_%d dimensao_%d dimensao_%d dimensao_%d cor_%.1f cor_%.1f cor_%.1f\n",pos_x, pos_y, pos_z, dim_x, dim_y, dim_z, cor_r, cor_g, cor_b);
   }

   getchar();
   fclose(arquivo);
   return 0;
}

Como vês, o fscanf retorna o número de valores que conseguiu ler. Ele devia ler 9 valores, se não o fizer é porque o arquivo acabou, e já não devemos imprimir mais nada.

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.