Ir ao conteúdo

Duvida leitura de arquivos em c


avl

Posts recomendados

Postado

Olá pessoal. Meu problema é o seguinte: Tenho um arquivo de entrada (txt) que meu programa precisa ler. Ele é composto por uma série de comandos (um por linha). Por exemplo:

CRIAPORTO santos

INCLUICONTAINERPORTO santos c1 navio1

Em que a primeira parte do comando é o nome da função que eu vou chamar e as demais partes são os parâmetros que essa função receberá. Minha duvida é como separar essas partes do comando e tratar elas. Sei que tenho usar o fopen pra abrir o arquivo e a função fgets para ler as linhas, mas nao sei como fazer essa separação.

Alguém poderia me ajudar?

Postado
Na verdade o scanf para de ler quando encontra um espaço :)

Sim. Mas o scanf é usado para ler do teclado, e eu quero ler de um arquivo. Por isso eu uso o fgets, que le uma linha ate encontrar o '\n'.

Postado
Use o fscanf :)

Mas ai ele só vai ler até encontrar um espaço, certo? E eu quero ler o comando inteiro, não só a primeira parte. Por exemplo, no comando:

CRIAPORTO santos

se eu usar fscanf ele vai ler só CRIAPORTO e pular pra proxima linha...

Postado

Ele vai continuar lendo daonde o ponteiro para o arquivo parou, se ele leu a primeira palavra e a palavra tem 4 caracteres, o ponteiro para o arquivo está na posição 4 e vai ler a proxima string.

Quem determina a posição desse ponteiro é o próprio programador, com a função fseek.

O ideal para o seu programa(na minha humilde opinião) seria criar uma string para ler o nome da função e outra(s) para ler o(s) argumento(s), mas teriamos que saber antes quantos argumentos essa função vai ter.

Pra isso teríamos quer ler o número de espaços que tem na linha.

Se você puder postar o que você já fez, seria bom, pois daí você faria do seu jeito e agente só ia ajudar a melhorar o código. :)

É claro, tem a forma mais óbvia de fazer também, que é usando a função isupper() para ler os caracteres maiusculos, guardar esses caracteres numa string e depois ler o resto

Postado

Tentei fazer usando a função sscanf. Ela le os dados presentes numa string. Considerando o arquivo de entrada 'entrada.txt' a seguir:


INICIALIZALISTACONT
CRIACONTAINER c1 navio1
CRIACONTAINER c2 navio2
CRIACONTAINER c3 navio3
CRIACONTAINER c4 navio4
CRIACONTAINER c5 navio5
INSERECONTAINERFINAL ls_containers c1
INSERECONTAINERFINAL ls_containers c2
INSERECONTAINERFINAL ls_containers c3
INSERECONTAINERFINAL ls_containers c4
INSERECONTAINERFINAL ls_containers c5
IMPRIMECONTAINERS ls_containers
LIBERACONTAINERS ls_containers


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(){


FILE* arquivo;
char str[60]; //vai armazenar a linha lida
char comando1[40]; //vai armazenar a primeira parte do comando (nome da função)
char comando2[20]; //armazena a segunda (argumento)
char comando3[20]; //etc.. (argumento)
char comando4[20];
arquivo = fopen ("entrada.txt","rt");

if (arquivo == NULL){
printf("Erro na abertura do arquivo\n");
exit(1);
}

while(fgets(str, 50, arquivo) != NULL){
int n = sscanf (str, " %s %s %s %s",comando1,comando2,comando3,comando4); //sscanf le a linha toda e ja vai jogando os comandos nas strings que eu criei acima

if ( strcmp (comando1,"INICIALIZALISTACONT") == 0 ){
lContainers* ls_containers = InicializaListaCont ();
}
if ( strcmp (comando1,"CRIACONTAINER") == 0 ){
Container* comando2 = CriaContainer ("comando2","comando3");
}
if ( strcmp (comando1,"INSERECONTAINERFINAL") == 0 ){
comando2 = InsereContainerFinal ("comando2", "comando3");
}
if ( strcmp (comando1,"IMPRIMECONTAINERS") == 0 ){
ImprimeContainers (comando2);
}
if ( strcmp (comando1,"LIBERACONTAINERS") == 0 ){
LiberaContainers (comando2);
}
}

fclose (arquivo);
}

So que estou com um problema na hora de chamar a função ImprimeContainers. Ela recebe um ponteiro para uma estrutura. No caso eu teria que passar o nome da estrutura, que é comando2. Acontece que aí ele ta recebendo a string comando2. Como faço pra converter a string para o nome da estrutura? Nao sei se expliquei bem, se quiserem explico de novo.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!