1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvidas C - Ficheiros

Discussão em 'Programação' iniciada por FrostPt, 4 de Agosto de 2012. (Respostas: 6; Visualizações: 733)

  1. Boas, tenho uma pequena dúvida que vocês talvez me possam ajudar. Então é assim, o objectivo é escrever uma palavra e o nome do ficheiro. O programa vai posteriormente procurar essa palavra nesse ficheiro e vai dizer em que linha é que está. Até aqui tudo simples.

    Agora o meu problema é saber em que linha é que está a tal palavra. O resto já está a funcionar sem erros.



    Acho que o meu problema é que com o define de MAX_Linhas = 200, só vai parar quando tiver esses tais 200 elementos no array linha. Penso que o limite no ficheiro de texto sejam 142 +/- ou seja ainda apanha um bom bocado da segunda linha. À medida que vão sendo feitos mais ciclos em vez de passar de 1 linha a 1, pode passar por exemplo 2. Hmmm um exemplo prático, estou a procura de uma palavra na 10ª linha, mas como tem esse tal problema está a aparecer na 7ª :/

    Já tentei como está ai:


    e ainda desta forma:
    Não dá erros das duas maneiras, mas não faz o que quero :/

    Toda a ajuda é bem-vinda, obrigado
     
  2. DotcomL

    DotcomL Power Member

    Primeiro deves inicializar a variável "m".

    Segundo, estás a verificar se a palavra existe na linha lida para cada letra da linha. Podes fazer essa verificação apenas uma vez. Três casos:

    -A palavra está na linha - termina o programa
    -A palavra não está na linha E a linha tem um '\n' - ler próxima linha e incrementar a variável "m"
    -A palavra não está na linha E a linha não tem um '\n' - ler próxima linha sem incrementar a variável "m"

    Nota: A função fgets lê até ao nº de caracteres que dás (neste caso MAX_linha) OU um EndOfFile OU um '\n'.
     
  3. Ok, já iniciei a variável m.

    Quando eu verifico caracter a caracter, também descubro se fez o '\n' ou não? Fiz um if geral e dps subdividi para dois casos: descobrir a palavra e tentar verificar se houve mudança de linha com o '\n', mas não incrementa o m.

    Se o fgets lê até ao MAX_Linhas devia ter passado pelo '\n'? E nesse caso, devia dar para detectar :/ Ou se calhar sou eu que já estou a inventar não sei :/
     
  4. Boas,

    o fgets(char *s,int n, FILE *stream) lê até n-1 caracteres. Até encontrar '\n' ou até encontrar EOF.

    se usares linux podes escrever: man fgets <enter>, para mais informaçoes.

    Exemplo:

    char txt[10];

    fgets (txt,9,stdin); //se introduzires ola, em txt fica "ola\n\0"

    Cumps
     
  5. Sidner

    Sidner Power Member

    E que tal fazer um ciclo de get lines, dentro desse ciclo fazes strtoks com token sendo " " e comparas palavra a palavra? Dentro do ciclo tens um contador que te conta a linha.
     
  6. @ee09115 porquê é que tem que ser até n-1 caracteres? O que é que acontece se ultrapassar? Não consigo encontrar nada de muito útil que me deixe responder a essas perguntas :S

    @Sidner pois, só tinha feito daquela maneira, pq os meus conhecimentos de C são bastante limitados. Pensava que se fizesse letra a letra, apanhava tambén o '\n' e dps usava um contador para contar quantas vezes tinha mudado de linha até encontrar a palavra. Mas devo fazer dessa maneira, parece mais fácil de se fazer :D
     
  7. Boas,

    é até n-1 caracteres pois é assim que a função está implementada, eu penso que é para que o ultimo caractere seja reservado para o '\0'. Se ultrapassar não existe qualquer problema relacionado com a execução do programa.

    Exemplo:

    se definires um vector com 5 caracteres, e leres 10 caracteres, a função fgets lê os primeiros 4 caracteres coloca no quinto caractere o '\0'. Os restantes caracteres serão perdidos.

    Já agora usar a função gets é má pratica de programação, pois se definires um vector de 5 caracteres e leres 10 caracteres, a função tentará colocar a mensagem em memoria não alocada o que originará falha de segmentação.

    Cumps
     

Partilhar esta Página