"Line breaks" numa string em C

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.
 
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
 
u32 size = 256;

char* text = (char*) malloc (size+1);

text[size] = '\0';

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

EDIT: Não vai...

Eu quero apresentar isto:
GECKO! GECKO!
In downtown New York, at a somewhat trashy apartment, there lived a man named Howard. He was a young man, in his mid-twenties, and had a terrible fear of cockroaches. Well if you've been to New York, and maybe live or stayed in a rundown hotel, you know how many cockroaches there are. Too many to count!

Mas só me aparece isto:
GECKO! GECKO!

Tudo o que aparece depois do line break... Puff...
 
Última edição:
É 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 );
 
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.
 
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 ! ;)
 
Back
Topo