Ir ao conteúdo

Ler arquivo1.txt gravar em arquivo2.txt


AndroidBr

Posts recomendados

Postado

Olá

Questão proposta:

- Ler arquivo1.txt e gravar em arquivo2.txt

- Cada linha lida no arquivo1.txt deverá receber uma numeração progressiva e estar entre aspas antes do conteudo ser gravado em arquivo2.txt

Exemplo lido em arquivo1.txt:

Fulano

Ciclano

Beltrano

...

Exemplo da gravação em arquivo2.txt:

1 ''Fulano''

2 ''Ciclano''

3 ''Beltrano''

...

Pelejei para construir esse exemplo no Dev-C++ através de outros exemplos semelhantes na net mas nenhum vingou, conto com você!

Postado

Abra um arquivo em modo leitura e outro em modo escrita, usando a função "fopen()".

A partir daí, use a função "fscanf()" para ler o conteúdo do primeiro arquivo e a função "fprintf()" para escrever no segundo.

Assim que terminar a leitura, feche os dois arquivos.

O que você já fez?

Postado
Abra um arquivo em modo leitura e outro em modo escrita, usando a função "fopen()".

A partir daí, use a função "fscanf()" para ler o conteúdo do primeiro arquivo e a função "fprintf()" para escrever no segundo.

Assim que terminar a leitura, feche os dois arquivos.

O que você já fez?

================================================

Olá ScreenBlack, quero agradecer primeiramente o tempo, energia,

espaço, direcionado para construção de ideais, muito obrigado!

Detalhando:

Não tenho curso superior na área, tão pouco sei profundamente programação, o desejo se manifestou por si só e desde então tenho procurado entender mais sobre esse universo.

Tenho na verdade mais idéias do que o conhecimento em programação,

essa questão dos arquivos, surgiu porque tive uma ideia de criar um

programa que fosse fácil para aprender e revisar vocabulário, no entanto

como a lista era grande, pegar cada palavra e adicionar no código manualmente levaria muito tempo e perderia no quesito produtividade, fora

isso, os próximos programas provalvemente iriam necessitar fazer o mesmo.

Então o que pensei... é mais fácil e eficiente que se crie um programa que gere o texto pretendido, do que propriamente digitar o código item por item.

Como as palavras deverão estar em vetores, eu só precisaria em teoria, ler o texto em um arquivo e acrescentar os itens necessários e gravar novamente em outro arquivo.

Com o código gerado anexaria no local apropriado.

Eu pesquisei no google os códigos que deveriam fazer o programa funcionar, mas encontrei alguns exemplos que nem mesmo funcionavam, pelo menos usando o Dev-C++ na versão 4.9.9.2.

Abaixo segue um exemplo que encontrei que poderia integrar o algoritmo.

#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("arquivo1.txt","a");
if (pFile!=NULL)
{

fputs ("teste",pFile);
fclose (pFile);
}

return 0;
}

Como disse, tenho mais a ideia de como seria o programa do que o conhecimento para programar, mas estou tentando me esforçar para faze-lo, por isso vim aqui buscar um pouco de luz nessa jornada que talvez para o iniciante em programação a primeira vista parece épica. Estou contando com cada um que puder ajudar nessa empreitada, desde já agradeço qualquer tipo de colaboração.

Postado

Montei um exemplo bem simples, que faz a leitura de um arquivo contendo diversas palavras e copiar para o segundo arquivo, usando o modo "append".


int main(void)
{
FILE *arquivo1 = NULL; /* Lista de Palavras Lidas */
FILE *arquivo2 = NULL; /* Recebera a copia do arquivo anterior */
char buffer[1024] = {'\0'};
unsigned contador = 0;

arquivo1 = fopen ("Lista-de-Palavras.txt","r");
if( arquivo1 == NULL )
{
perror("Erro ao abrir o arquivo: Lista-de-Palavras.txt . Motivo");
return 1;
}

/**
* Fazer a copia apenas das 20 primeiras palavras, pra não destruir o disco.
* Para não ocorrer essa restrição, basta remover o controle abaixo.
*/
while( !feof(arquivo1) && contador++ < 20 )
{
fscanf(arquivo1, "%s", buffer);

/**
* Abre o segundo arquivo para cada palavra lida do primeiro.
* A ideia é testar o modo "append" do arquivo.
*/
arquivo2 = fopen("Lista-de-Palavras_2.txt", "a");
if( arquivo2 == NULL )
{
perror("Erro ao abrir o arquivo: Lista-de-Palavras_2.txt . Motivo");
return 1;
}

/**
* Insere no segundo arquivo o conteudo lido do primeiro, adicionando uma quebra de linha ao final.
*/
fprintf(arquivo2, "%s\n", buffer);

fclose(arquivo2);
}

fclose(arquivo1);

return 0;
}

A lista de palavras usadas, foram retiradas desse link: Lista-de-Palavras.txt

Espero que ajude.

Postado

Perfeito ScreenBlack!!

Com algumas modificações (depois de inumeras tentativas e devo dizer agora são 4:20 Am kkkk rs) ficou perfeito e valeu a pena.



#include <stdio.h>
int main(void)
{
int i;
while (i!=0){
printf(" ! Obrigado ScreenBlack !\n\n\n\n"); //Obrigado infinito ^^
i = i + 1;
}
}

Postado

ScreenBlack, surgiu uma nova questão, algumas palavras na minha lista estão com a primeira letra minuscula, e gostaria que elas ficassem com a primeira letra maiuscula pesquisei aqui pelo forum e tinha alguns modelos parciais, mas não entendi o funcionamento. Segue os exemplo que encontrei no google e gostaria que me ajudasse a

interpreta-los:

 

//Primeiro exemplo

#include <ctype.h>
#include <string.h>
frase[0] = '\0';
gets(frase);

frase[0] = toupper(frase[0]);
for(i=0; i<strlen(frase); i++){
if(frase[i] == ' ')
frase[i+1] = touuper(frase[i+1]);
}


// Segundo exemplo

Function ConverteMaiuscula(Texto : string):String; {Converte a primeira letra de todas as palavras de uma string para maiúscula é o resto para minuscula}
var Contador : integer; Linha : string;
begin
Result := '';
Texto := Trim(Texto);
repeat
Contador := Pos(' ', Texto);
if (Contador <= 0) then
Contador := Length(Texto) + 1;

Linha := UpperCase(Copy(Texto, 1, Contador-1));
if (Length(Linha) <= 2) or (Linha = 'DAS') or (Linha = 'DOS') then
begin
Result := Result + Copy(Texto, 1, Contador-1)
end
else
begin
Result := Result + UpperCase(Texto[1]) + AnsiStrLower(Pchar(Copy(Texto, 2, Contador-2)));
end;

Delete(Texto, 1, Contador);
if (Texto <> '') then
begin
Result := Result + ' ';
end;
until (Texto = '');
end;


Postado

Android,

A pergunta foi direcionada, mas tomei a liberdade para comentar.

Ambos os códigos são fragmentos de programas, sendo o primeiro escrito em C e o segundo em Object Pascal. Misturar as duas linguagens nessa fase inicial de seus estudos talvez não seja muito produtivo. Particularmente, acho que vai atrapalhar. Vamos tentar entender o processo.

Primeiro, você quer a palavra em caixa baixa para depois capitalizá-la, certo? Se a palavra for "abAcaTe", você quer fazer "Abacate", ok?

Funções de interesse a estudar:

toupper() e tolower()

Pegando o exemplo acima, se o vetor palavra tiver o conteúdo 'abAcaTe', então, se você fizer:

palavra[0] = toupper(palavra[0])

Agora, palavra tem 'AbAcaTe'.

Agora, você precisa pegar da posição 1 até o fim da palavra e mudar para caixa baixa cada caractere:

palavra[1] = tolower(palavra[1])
.
.
.
palavra[6] = tolower(palavra[6])

E você vai ter palavra com 'Abacate'

Basta implementar a ideia num laço de repetição e você terá feito o que deseja. Use strlen() para saber o tamanho da string. No exemplo acima, retornaria 7.

Abraço,

LNW

Postado

Olá LNW

Implementei o loop como sugeriu e ficou muito bom, adicionei o algoritmo no programa anterior, mas notei que alguns casos com palavras acentuadas não estão sendo transformadas, ainda não encontrei algum algoritmo em C++ mostrando como fazer isso somente esse em pascal:

http://olimpiada.ic.unicamp.br/info_geral/programacao/programacao_junior/pdf/introcomp/secao8.pdf

Página 6 vem com o exemplo.

Muito obrigado pela força, é bom saber que existem pessoas como você e o ScreenBlack dispostas a colaborar, espero algum dia poder chegar ao level de vocês e ajudar as pessoas também, mantendo esse fluxo continuo de ensino/aprendizagem.

o/

Postado

Olá ScreenBlack e LNW

Gostaria da ajuda de vocês novamente ou de quem puder

Questão:

- Extrair uma parte de texto, trecho a trecho.

- Onde se possa setar onde começa a extração e onde termina através de um caractere no texto.

Exemplo: Começa em "}" termina em "/". O trecho em vermelho será extraido.

Já fiz algumas pesquisas pelo forum e pelo google mas sem sucesso chegando nesse ponto meu único recurso e esperança são vocês que já carregam uma vasta gama de experiência.

Ps¹ Estou incorporando todos os algoritmos anteriores no mesmo programa.

Postado

Para fazer busca de uma letra num texto, use a função "strchr()".

exemplo:


char texto[] = "qwelkj}oiuqwasf/avsdlfkj";
char *inicio = texto;
char *fim = NULL;

inicio = strchr(inicio, '}');
inicio++;
fim = strchr(inicio, '/');

while( inicio != fim )
printf("%c", *inicio++ );

Se quiser procurar mais conteúdos no mesmo texto, basta igualar "inicio" com "fim" e repetir a busca, não esquecendo de validar o término da string.

No exemplo acima, estou garantindo que sempre existirá os carácteres "}" e "/". Caso isso não seja verdade, precisa fazer a verificação.

Quando a função "strchr()" não encontrar a letra no texto, retornará NULL.

Postado

ScreenBlack

Com um texto maior o algoritmo esta gerando erro

Pensando que era algo haver com muitas linhas de texto no código, tentei fazer ele ler o texto de um arquivo.txt, mas não consegui dessa vez mesclar os algoritmos de ler do arquivo.txt juntamente com o que extrai os caracteres entre "}" "/"

Usei esse texto de entrada:

{1} the /o, a, os, as/ [1] The book is on the table (O livro está sobre a mesa) [2] The girl is talking to the doctor (A menina está conversando com o médico) [3] The cars are new (Os carros são novos) [4] The women are preparing the food (As mulheres estão preparando a comida)

no lugar de qwelkj}oiuqwasf/avsdlfkj e gerou erro.

Postado

Testei trocando a minha string pela sua, usando o código que postei anteriormente e me retornou corretamente isso:


the

É a string contida após o "}" e o primeiro "/".

Não é isso que você quer?

Postado

Tenta o texto maior assim:

{1} the /o, a, os, as/ [1] The book is on the table (O livro está sobre a mesa) [2] The girl is talking

to the doctor (A menina está conversando com o médico) [3] The cars are new (Os carros são

novos) [4] The women are preparing the food (As mulheres estão preparando a comida)

{2} of /de, da, dos, das/ [1] A man of humble origins (Um homem de origens humildes) [2] She is

the best of all teachers (Ela é a melhor das professoras) [3] The book of books (O livro dos livros)

{3} and /e/ [1] Mary and John are married (Maria e João são casados) [2] I am learning to read

and write (Estou aprendendo a ler e a escrever) [3] Study hard and you will pass your examination

(Estude bastante e você passará no seu exame)

Postado

Tava pensando em como solucionar essa questão, veja se funciona:

-Colocar todo o texto captado do arquivo.txt em vetor.

-Percorrer esse vetor, trecho a trecho como no exemplo anterior.

-Extrair os vetores que estão entre os trechos.

Obs: Ao captar o texto o vetor deverá receber tambem os espaços em branco.

A ideia seria essa, mas o algoritmo eu não consegui fazer, estava tentando mesclar os algoritmos que já foram mostrados aqui no tópico.

Ps¹ Também não sei se resolveria a questão em si.

Postado

É exatamente essa a ideia.

Como o texto possui um padrão e para o buffer não ficar muito grande, o melhor seria fazer a leitura de onde começa "{" até a posição anterior ao próximo "{", fazendo a leitura carácter-por-carácter. Espaços em branco e quebras de linhas, são considerados caracteres, também, porém, não legíveis para humanos.

Os carácteres padrão, você pode encontrar na tabela ascii. Todo carácter terá uma representação em número inteiro (sem sinal).

A leitura pode ser feita pela função "fgetc()".

Para simplificar a leitura do buffer, pode ser trocada a quebra de linha por um espaço, no momento da leitura do arquivo. Dessa forma, não confundirá a função "strchr()" no momento da busca.

Para o que você vai precisar, tem um exemplo aqui

Lembrete: Não esqueça de fechar o arquivo após o término de seu uso.

Postado
Para fazer busca de uma letra num texto, use a função "strchr()".

exemplo:


char texto[] = "qwelkj}oiuqwasf/avsdlfkj";
char *inicio = texto;
char *fim = NULL;

inicio = strchr(inicio, '}');
inicio++;
fim = strchr(inicio, '/');

while( inicio != fim )
printf("%c", *inicio++ );

Se quiser procurar mais conteúdos no mesmo texto, basta igualar "inicio" com "fim" e repetir a busca, não esquecendo de validar o término da string.

No exemplo acima, estou garantindo que sempre existirá os carácteres "}" e "/". Caso isso não seja verdade, precisa fazer a verificação.

Quando a função "strchr()" não encontrar a letra no texto, retornará NULL.

Sabe Screen atualmente só tenho um lado da moeda, que seria ter idéias, não entendo de programação quase nada (mas estou em um esforço máximo, do que meu físico e mental suporta, me pego vegetando em loop de frente a tela buscando entender a leitura dos códigos dia após dia), não consegui fazer desse jeito que você disse pra fazer mesmo pesquisando, então realmente não sei como fazer (a função não encontrar a letra no texto e retornar NULL) quero aprender como fazer me ensine!

A outra forma que consegui é bem arcaica da uma olhada:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{

char texto[] = "{1}the /o, a, os, as/ [1] The book is on the table(O livro estásobre a mesa)[2] The girl is talking to the doctor(A menina estáconversando com o médico)[3] The cars are new(Os carros sãonovos)[4] The women are preparing the food(As mulheres estãopreparando a comida){2}of /de, da, dos, das/ [1] A man of humble origins(Umhomem de origens humildes)[2] She is the best of all teachers(Ela é a melhor das professoras)[3] The book of books(O livrodos livros){3}and /e/ [1] Mary and John are married(Maria e Joãosão casados)[2] I am learning to read and write(Estouaprendendo a ler e a escrever)[3] Study hard and you will passyour examination(Estude bastante";

char *verifica = texto;
char *fim = NULL;
int i = 0;

loop:
i = i + 1;

verifica = strchr(verifica, '}');
verifica++;
fim = strchr(verifica, '/');

while (verifica!= fim)
printf("%c", *verifica++ );

while (i<3)
goto loop;

printf("\n\n\n");
system ("PAUSE");

}

Obs: E só dá certo assim se souber o número de ocorrencias no texto.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...