• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

amp

Inversão de linhas num ficheiro

7 mensagens neste tópico

Bom dia,

Eu tenho de inverter a ordem em que aparecem as letras de uma linha de um ficheiro, isto é, a primeira letra da linha passa a ser a última e a última passa a ser a primeira.

Para isso, usei a função fgets() para ler as linhas e depois inverti a string que continha a linha e escrevi no ficheiro de saida.

Mas tenho uma dúvida. Se a linha do ficheiro for maior que o número especificado na função fgets() a inversão não corre bem porque ao chegar ao máximo de caracteres aceites por fgets() muda de linha.

Deixo aqui o código para me poderem ajudar.

Dêem sugestões para melhorar o programa :P

Obrigado  :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Funcao ajuda
void 
ajuda (status)
{
  printf ("\n\t\t\t*** MENU AJUDA ***\n\n");
  printf ("A entrada na linha de comando deve ter a seguinte forma:\n\n");
  printf ("   <nome_do_programa> <fich_leitura> <fich_escrita>\n\n");
  printf ("\n");
  exit(status);
}

//Funcao-Inversao de strings
char *reverse(char *s)
{
  int i=0, len=strlen(s);
  char aux;
  
  for(i=0; i<len/2 ; ++i)
    {
      aux=s[i];
      s[i]=s[len-1-i];
      s[len-i-1]=aux;
    }
  
  return s;    
}

//main
int 
main( int argc, char **argv )
{
  char c[256];
  
  //Mostrar ajuda - Erro nos argumentos
  if(argc!=3)
    ajuda(-1);                                  
  
  FILE *in,*out;
  
  /*Abertura do ficheiro de leitura e verificacao*/
  in=fopen(argv[1],"rt");
  if(in==NULL)
    {
      printf("\n\t*** Ficheiro de entrada nao existe! ***\n\n");
      return(-1);
    }
  
  /*Abertura do ficheiro de escrita e verificacao*/
  out=fopen(argv[2],"wt");
  if( out==NULL )
    {
      printf("\n\t*** Erro na abertura de ficheiro de escrita ***\n\n");
      return(-1);
    }
  
  /*Inversao de cada linha do ficheiro e escrtia no ficheiro de saída*/
  while( fgets(c,256,in) )
    fprintf(out,"%s",reverse(c));
  
  fclose(in);
  fclose(out);
     
  printf("\n\t*** Ficheiro \"%s\" invertido com sucesso! ***\n\n",argv[1]);
  printf("\t O resultado pode ser visualizado no ficheiro \"%s\"\n\n",argv[2]);
  
  return 0;
} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então e se aumentares o tamanho da string? Por exemplo para 400? Se souberes mais ou menos um limite aceitável que o utilizador não ultrapassará, basta isso. Se não, podes usar memória dinâmica e ires adicionando caracteres até já não ser preciso. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas, por exemplo, se abrir o ficheiro no Word cada linha tem menos caracteres do que se o abrir no notepad. Não há nenhum numero máximo de caracteres por linha para todos os editores de texto?

E também no word, se escrevermos uma sequencia de letras sem espaços a ocupar duas linhas esta sequência de duas linhas conta como apenas um linha. Não há nenhuma forma de detectar que mudu de linha?

Obrigado;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já percebi a minha dúvida. Mas surgiu-me outra :-[.

O ficheiro invertido vem com uma mudança de linha antes da primeira frase. Porquê? E como é que posso corrigir isto?

Obrigado  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é porque não estás a retirar o '\n' (mudança de linha) que o fgets lê de todas as linhas. De modo que quando lês a 1ª linha, lês algo como "bla blabla\n" e ao inverter ficas com "\nalbalb alb". Como o 1º caracter passar a ser o '\n', vai aparecer uma mudança de linha antes da 1ª frase. Para retirar o '\n' em cada leitura podes fazer:

fgets(str,sizeof(str),fp);
str[strlen(str)-1]='\0';

Assim sobrepões o caracter de terminação de string ao '\n'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O caracter de mudança de linha '\n' vem na string que lês. Quando invertes a string ficas com '\n' seguido do resto da string.

EDIT: Beaten to it

Atenção que se fizeres o que o Baderous disse tens que escrever \n para o ficheiro no fprintf a seguir à string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora