killezio Posted January 24, 2016 at 11:36 AM Report Share #592421 Posted January 24, 2016 at 11:36 AM (edited) ora bem, eu queria armazenar num apontador uma string cujo tamanho eu só sei depois de o ler num ficheiro de texto. imaginemos que eu guardei o tamanho dessa string numa variável D agora eu quero ler a string toda de uma vez ( que também está no ficheiro de texto) sabendo já qual o tamanho dela. pensei em fazer assim fscanf("read,%.3s",word); onde o 3 é realmente o tamanho da string, mas isso eu já sei por ler o ficheiro antes de escrever o código. Como é que eu faria para o "3" em "%.3s" ser uma variável? Edited January 24, 2016 at 11:44 AM by killezio Link to comment Share on other sites More sharing options...
pwseo Posted January 24, 2016 at 11:57 AM Report Share #592422 Posted January 24, 2016 at 11:57 AM killezio, O mais acertado (parece-me) será criar um buffer suficientemente grande para leres a string de uma vez. Se esse buffer for alocado via malloc e não for suficiente para ler a string, podes sempre reallocar para aumentar o tamanho e ler o que falta da string. De qualquer modo, a menos que estejas a ler um documento inteiro enorme para dentro de uma única string, penso que a opção mais sensata é mesmo criar um espaço grande o suficiente, mesmo que isso te gaste alguns bytes de memória a mais. Link to comment Share on other sites More sharing options...
killezio Posted January 24, 2016 at 12:32 PM Author Report Share #592424 Posted January 24, 2016 at 12:32 PM killezio, O mais acertado (parece-me) será criar um buffer suficientemente grande para leres a string de uma vez. Se esse buffer for alocado via malloc e não for suficiente para ler a string, podes sempre reallocar para aumentar o tamanho e ler o que falta da string. De qualquer modo, a menos que estejas a ler um documento inteiro enorme para dentro de uma única string, penso que a opção mais sensata é mesmo criar um espaço grande o suficiente, mesmo que isso te gaste alguns bytes de memória a mais. como estou preocupado com a performance do programa queria fazer as coisas no limite, mas obrigado pela sugestão 🙂 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 24, 2016 at 12:39 PM Report Share #592426 Posted January 24, 2016 at 12:39 PM como estou preocupado com a performance do programa queria fazer as coisas no limite, mas obrigado pela sugestão 🙂 e sabes o "tempo" que estás a perder a determinar o tamanho da string no ficheiro ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pwseo Posted January 24, 2016 at 02:32 PM Report Share #592432 Posted January 24, 2016 at 02:32 PM Já dizia o sr Knuth: Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. Além disso, no teu caso estás efectivamente a prejudicar a performance com os passos adicionais para determinar o tamanho da string, alocar a memória convenientemente, ler a string (novamente) e libertar a memória no final. Link to comment Share on other sites More sharing options...
killezio Posted January 24, 2016 at 06:48 PM Author Report Share #592452 Posted January 24, 2016 at 06:48 PM (edited) eu preciso de saber o tamanho da string, aliás o tamanho é dado. No problema que estou a tentar resolver testam se fizeste bem e se o programa corre relativamente rápido. eles dão me muitas strings mas em cada uma também me dão o tamanho delas. se o tamanho é dado e só custa ao processador ler um short int num ficheiro de texto para saber o tamanho ( para nao falar que vou precisar do tamanho para outra coisa mais tarde) então decidi ir por aí. ora aqui surgiu outra dúvida, eu pretendo guardar cada string num vetor de apontadores mas não estou a conseguir, aqui está o código devidamente comentado: #include <stdio.h> void read_top(FILE **read,short int *L, short int *D, short int *N){ fscanf(*read,"%hd %hd %hd",L,D,N); // sendo L o tamanho das strings e D quantas strings vou ler, o resto nao interessa para a dúvida fgetc(*read); // retirar o \n } void save_words(FILE **read,char **dic,short int L,short int D){ // o problema está nesta função int e; for (e = 0;e < D;e++){ fgets((*dic)[e],L+1,*read); // já sabendo o tamanho das strings que quero ler, L, queria ler uma de cada vez e guardar no vetor de apontadores "dic" mas não estou a conseguir. é aqui que preciso de ajuda fgetc(*read); // pasasr o \n à frente } } void abrir(FILE **read,FILE **write) { *read = fopen("teste4.in","r"); *write = fopen("Allien_language","w"); } main(){ FILE *read,*write; abrir(&read,&write); short int L,D,N; read_top(&read,&L,&D,&N); char *dic[D]; // vetor de apontadores save_words(&read,dic,L,D); // é nesta função que estou a ter problemas //printf("\nL = %hd\nD = %hd\nN = %hd\n",L,D,N); //printf("\n%s\n",dic[0]); } Edited January 25, 2016 at 08:58 PM by thoga31 GeSHi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 25, 2016 at 04:58 PM Report Share #592489 Posted January 25, 2016 at 04:58 PM o primeiro argumento da função fgets necessita que passes um endereço de memória válido para uma região já reservada, o que não está a acontecer IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
killezio Posted January 26, 2016 at 01:30 PM Author Report Share #592553 Posted January 26, 2016 at 01:30 PM já resolvi o problema Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 26, 2016 at 02:28 PM Report Share #592555 Posted January 26, 2016 at 02:28 PM já resolvi o problema e código ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
killezio Posted January 27, 2016 at 02:38 PM Author Report Share #592608 Posted January 27, 2016 at 02:38 PM a processar xd bem, o que estava a fazer mal era o fgets, realmente tinha que mandar dic[e] em vez de *dic[e]. fix também um malloc para o dic[e] de tamanho <L+1> para ocupar pouco espaço na memória na linha atrás do fgets. 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