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

"Line breaks" numa string em C

Discussão em 'Programação' iniciada por eyeliner, 26 de Novembro de 2006. (Respostas: 6; Visualizações: 878)

  1. eyeliner

    eyeliner Power Member

    Ora bem, iniciei-me na programação em C para a NDS e cheguei a um bloqueio.
    Manipular imagens e srites até que não é difícil (e a ajuda é muita), mas para texto,
    é mais complicado obter respostas...

    Aqui vai:
    Código:
    // Includes
    #include <PA9.h>       // Include for PA_Lib
    #include <stdio.h>
    // Function: main()
    int main(int argc, char ** argv)
    {
    	PA_Init();    // Initializes PA_Lib
    	PA_InitVBL(); // Initializes a standard VBL
    	PA_InitText(0, 0); 	// Background number, from 0-3, on which to load the text system
    	PA_InitText(1, 0); // Initialise the text system on the top screen
    	PA_FSInit();
    
    	char* text = PA_PAFSFile(0); //O conteúdo do ficheiro vai para a variável text
    	
    	PA_BoxText(1, 2, 2, 29, 15, text, 500); //O texto fica formatado numa caixa
    	// Infinite loop to keep the program running
    	while (1)
    	{
    		PA_WaitForVBL();
    	}
    		
    	return 0;
    } // End of main()
    O que acontece é que o texto que é apresentado na consola ignora completamente
    os line breaks do ficheiro. alguém tem uma explicação lógica para isto?

    Qual é a função que permite fazer o que quero em C "normal"?

    Obrigado.
     
  2. TuxBoss

    TuxBoss Power Member

    o printf() ou fprintf() fazem isso.
    Assegura-te que estás a copiar os chars do ficheiro para uma zona de memoria com tamanho suficiente (nº de chars normal + '\n' + '\0'), normalmente o pessoal só pensa no numero de chars verdadeiros e aloca memoria insuficiente e o C que normalmente costuma ser muito picuinha com estas coisas, deixa andar e os resultados são imprevisíveis
     
  3. eyeliner

    eyeliner Power Member

    Será que é isto? Dou 256 bytes à string (mais o terminador)?

    EDIT: Não vai...

    Eu quero apresentar isto:
    Mas só me aparece isto:
    Tudo o que aparece depois do line break... Puff...
     
    Última edição: 26 de Novembro de 2006
  4. MaxDamage

    MaxDamage Power Member

    Que diferentes parâmetros pode receber a função PA_PAFSFile() ?
     
  5. TuxBoss

    TuxBoss Power Member

    É natural que só dê a primeira linha, as funções da familia printf() usam os '\n' como delimitadores.
    Para imprimires o texto todo tens de criar um ciclo
    Código:
    while( fprintf(FILE,"%s") > 0 );
    
     
  6. bruno_eg

    bruno_eg Banido

    O problema é que tratas a string como uma string e não como um array de chars.
    Agora não tenho o nome da função, mas tenta ver como se faz um "cat" de Unix em C e podes encontrar aí a tua solução.
     
  7. Homem Bomba

    Homem Bomba Power Member

    Código:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAMANHO_MAXIMO_LINHA 4096
    #define NOME_FICHEIRO "ficheiro.txt"
    
    
    void leDoFicheiro(char* nomeDoFicheiro)
    {
        if(!nomeDoFicheiro)
        {
            perror("NOME DE FICHEIRO INVALIDO\n");
            return;
        }
    
        FILE* descritor=fopen(nomeDoFicheiro,"r"); ///Abrir ficheiro para leitura
        
        if(!descritor)
        {
            perror("Impossível abrir ficheiro\n");
            return;
        }
    
        char* linhaLidaDoFicheiro= (char*) malloc (TAMANHO_MAXIMO_LINHA* sizeof(char)); ///Vai guardar a 1ª linha lida do ficheiro.
        
        char buffer[TAMANHO_MAXIMO_LINHA]; ///Buffer para ler cada linha do ficheiro (preciso para o fgets...)
        
        while((linhaLidaDoFicheiro=fgets(buffer,TAMANHO_MAXIMO_LINHA,descritor))) ///fgets devolve apontador para o inicio do buffer
        {
            linhaLidaDoFicheiro=(char*) realloc (linhaLidaDoFicheiro, strlen(linhaLidaDoFicheiro)); ///Usar apenas o tamanho que precisamos para a string. Libertar o resto.
            
            printf("linhaLidaDoFicheiro = %s\n",linhaLidaDoFicheiro);
        }
    }
    
    int main()
    {
        leDoFicheiro(NOME_FICHEIRO);
        return 0;
    }
    
    
    Compilado com o gcc 3.42.

    Eu faria assim. Como não sei o que querer fazer com as strings, este código só as imprime no ecrã ;)

    Quanto ao buffer, 4k é um bocado abusado. Usei realloc para depois limpar, mas não sei em que plataforma estás a trabalhar...É contigo.

    Cumps.

    PS: Não te esqueças de mais tarde fazer os free()'s ! ;)
     

Partilhar esta Página