amp Posted November 15, 2009 at 10:06 AM Report Share #296272 Posted November 15, 2009 at 10:06 AM 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 More sharing options...
Tharis Posted November 15, 2009 at 10:54 AM Report Share #296277 Posted November 15, 2009 at 10:54 AM 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. 🙂 Link to comment Share on other sites More sharing options...
amp Posted November 15, 2009 at 12:20 PM Author Report Share #296282 Posted November 15, 2009 at 12:20 PM 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 More sharing options...
amp Posted November 15, 2009 at 12:22 PM Author Report Share #296283 Posted November 15, 2009 at 12:22 PM 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 👍 Link to comment Share on other sites More sharing options...
Baderous Posted November 15, 2009 at 12:47 PM Report Share #296286 Posted November 15, 2009 at 12:47 PM 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 More sharing options...
pedrosorio Posted November 15, 2009 at 12:49 PM Report Share #296287 Posted November 15, 2009 at 12:49 PM 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. Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
amp Posted November 15, 2009 at 01:20 PM Author Report Share #296291 Posted November 15, 2009 at 01:20 PM Ok. Obrigadíssimo aos dois 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now