Jump to content

Inversão de linhas num ficheiro


amp
 Share

Recommended Posts

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 😛

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;
} 
Link to comment
Share on other 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;)

Link to comment
Share on other 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'.

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.