• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sarapintas

ajuda projecto

17 mensagens neste tópico

boas! bem o que eu queria saber é algo do género eu para ler strings de um ficheiro testo costumo usar 

fscanf(f, "%[^\n]\n", nome);

e ele assim lê até encontrar uma mudança de linha... o que eu queria saber é do tipo

tenho 3 palavras na mesma linha e fazer da seguinte maneira, ler a primeira meter numa char e depois ler as outras duas supostamente com o método que descrevi em cima, mas não estou a conseguir ler só uma e continuar na mesma linha...

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ao fazeres isto tas a ler ate encontrar um '\n'

fscanf(f, "%[^\n]\n", nome);

para ler ate encontrar um espaço é só trocar o '\n' por ' '

fscanf(f, "%[^ ] %[^ ]\n", nome1, nome2);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois mas como o segundo nome nem sempre existe, eu já consegui resolver mas foi de outra maneira.

    fp1 = fopen("inst.txt", "r");     
    fscanf(fp1, "%s", opcao);    
    if (!strcmp("ORD",opcao)){
       fscanf(fp1, "%s", subopcao);
       fscanf(fp1, "%d", &ini);
       fscanf(fp1, "%d", &tam);
       }
    else{
        fscanf(fp1, "%d", &ini);
        fscanf(fp1, "%d", &tam);
        }
    fclose(fp1);

isto recebe algo do genero

ORD ASC

o

1

ou

REM

2

3

por ai... e fucnina :) isto basicamente é para ler de um ficheiro texto instuçoes para ordenar apagar e ler

Agora tenho outra duvida, como é que eu leio de um ficheiro txt uma informacao sobre o tipo de dados contido num outro ficheiro .dat

ou seja, por exemplo struct.txt é um ficheiro de texto que contém um ou mais linhas, cada uma delas com o nome de um tipo ou vector, pela mesma ordem que esse tipo tem na estrutura dos dados que existem no ficheiro .dat

Não sei se me fiz entender muito bem mas basicamente é ler os tipos de dados de ficheiro txt ond os valores estao pela mesma ordem num ficheiro .dat

isto é para um projecto da faculdade estou a ter algumas dificuldades a fazer esta parte... se alguem quiser dar umas dicas sou todo de ouvidos!

cumps e obrigado nata79 por teres respondido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uma hipotese é definires, por exemplo que 0 corresponde a um tipo de dados, 1 corresponde a outro, etc...

vais lendo o struct.txt e fazes um switch, se for 0 les um tipo de dados do .dat, se for 1 les outro, etc...

não sei se dá pra fazer doutra forma, nunca trabalhei muito com ficheiros binários por isso tou um bocado às escuras...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acho que deve haver forma mais fácil de fazer isso,

tipo tenho o struct.txt que basicamente tem lá

int
char[25]
float

depois o .dat

tem

12 *** sarapintas *** 2.300000 ***

poderia fazer como fiz para ler o .inst mas em modo binario tb estou assim um poco as escuras...

talvez leitura por blocos?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu iria pelo que disse o nata79.

Também podes interpretar como texto, mas só iria complicar. Não é trivial interpretar coisas como char[25], quando pode aparecer um char simples. Não é o fim do mundo, mas por exemplo, se 0 significar "array", 1 int, 2 char e 7 float, é bem mais simples interpretar

1

0 2 25

7

como "int (1), em seguida um array (0) de char (2) com tamanho 25 (25), e em seguida um float (7)".

Já agora, o .dat terá mesmo esse formato com os asteriscos a separar valores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou sou eu não estou a perceber ou então não me estou a explicar muito bem.

Bem imaginem um problema simples que lê um ficheiro txt e com base nisso define um tipo de dados, e o conteudo.

ou seja temos um ficheiro do genero

char

tudo bem, le o txt mete numa string, strcmp com "char". Ok já sabemos que é um char, defenimos então agora

char X

, temos noutro ficheiro que tem nada mais nada menos que

B

lemos o ficheiro ok, metemos b em X. Ok tá feito temos um char x com valor "B"

tudo bem, e como é que fazemos com um vector de n posições? sabendo que o tamanho pode variar e para fazer a leitura do ficheiro em binário preciso do tamanho, como fazia isso? Precisava de compreender que char[25] o tamanho do char seria sizeoff(char)*25, pois e como faço isso em leitura por testo, ler de um ficheiro txt e separar o tipo de dados do tamanho, ou seja ler o char e meter numa variável e ler o 25 e meter em outra variável... essa é a minha duvida do momento...

Já agora, o .dat terá mesmo esse formato com os asteriscos a separar valores?

não o .dat tem supostamente "espaços binários" xD a separar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu percebi o que tu queres, apenas te disse (como o nata79 antes tinha dito) que era mais fácil utilizares códigos numéricos para os tipos em vez de texto.

De qualquer forma, se utilizares strchr para procurar pelos caracteres '[' e ']' e os encontrares, sabes que é um array, e que tens a sua dimensão entre as posições desses caracteres. Se não encontrares, é uma variável "normal".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acabaste de me dar uma grande ajuda com isso do strchr, já agora pesquisei na net e não percebi muito bem o que isso retorna, isso retorna a posição? na string onde está o "[" ou "]" se for a posição vai me dar um grande jeito, fazia a posição +1 até a segunda posição menos um e ficava com a posições do array... o que era um grande ajuda! Mas ai ficava-me outra duvida, para acder a uma dada posição de um array fazia a[posicao]=b;  supostamente funcionava, mas como o primeiro array é uma string e b era um inteiro ou unsigned...devia ir dar incompatibilidade de dados ou algo parecido não?

ou então metia lixo... como faço isso?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

afinal dá, pensava que não dava e falei antes de testar...

cumps e obrigado por tudo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora é que me perdi ::)

a[posicao]=b ? Qual é o valor de b, e onde vais buscar esse valor?

E que array é a? A linha que leste do ficheiro onde tens os tipos, ou o array para onde vais escrever os dados do 2º ficheiro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

parece que descobri um bug deste compilador e nem me apercebi, vi só que estava a dar o resultado certo lol, bem me parecia que isto não se podia fazer assim

repara


   char a[6] = "x923o";
   int b;

   b = a[1];
   printf("b = %c\n", b); /* aqui enganei-me %c devia estar %d por que b é interio, mas isto assim funciona estranho o.O*/

assume que b é um char, independente do que declarei a cima...

ele mete o b igual a posição 1 do vector a ( o 9), está mal claro isto não se pode fazer assim, mas o engraçado é que funciona =X se trocares o %c por %d claro deixa logo de funcionar...

solução?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se b for char, ao colocares %d no printf vais tentar ler 4 bytes (tamanho de int) duma variável que tem 1byte (tamanho de char). Vais ler um byte correcto e o resto é lixo.

Se b for inteiro e colocares lá um %c, ele vai escrever o valor do primeiro byte de b.

O meu post acima era neste mesmo sentido. Não está mal, faz parte da linguagem.

no teu exemplo, se queres ler o 923, faz o seguinte:

	char a[6] = "x923o";
int b;
char* xpos, *opos;

xpos = strchr(a, 'x'); // encontrar a posicao anterior ao 1º algarismo
opos = strchr(a, 'o'); // encontrar a posicao posterior ao ultimo algarismo
*opos = '\0';          // terminar a string na posicao do 'o'
sscanf(xpos + 1, "%d", &b); // ler um inteiro a partir da posicao a seguir ao 'x'

printf("b = %d\n", b);

EDITs: irra, não me lembro de ter posto código com tantos erros...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

strchr esta no string.h certo?

não estou a conseguir compilar, esta-me a pedir cast...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim... não tinha tentado compilar

Estive a corrigir o código, agora já deves conseguir compilar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eheh já consegui e editei para guardar tb o alterei para ler qualquer tipo de dados

{
       char a[10] = "int[93]";
       int b;
       char* xpos, *opos, *xopos;
       char tipo[10];
       xpos = strchr(a, '['); // encontrar a posicao anterior ao 1º algarismo
       opos = strchr(a, ']'); // encontrar a posicao anterior ao ultimo algarismo
       *opos = '\0';          // terminar a string na posicao do 'o'
       sscanf(xpos + 1, "%d", &b); // ler um inteiro a partir da posicao a seguir ao 'x'

       sscanf (a,"%[^[]",tipo);
       printf("tipo '%s'\n", tipo);
       printf("de '%d' posicoes\n", b);

       system("pause");
}

isto vai me dar um jeito tamanho do mundo...

cumps e obrigado a todos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora