Jump to content

Ler linhas de um ficheiro


Recommended Posts

Posted

Boas pessoal,

Eu tenho um ficheiro que contem dados na seguinte forma:

Nome1;Local1

Nome2;Local2

O que eu quero fazer é aceder ao ficheiro,Redes.txt, e obter cada um dos elementos e guardá-los em variaveis distintas.

eu fiz isto,ver codigo em baixo, mas está a dar um erro. Sinceramente nem sei se é possivel ou se é boa pratica ler assim os elementos.

FILE *f;
   f = fopen("Redes.txt","r");
   if(f!=NULL){
   char infoLinha[357],str1[100],NomeRepetido='0';
  /* abre novamente para a leitura  */
while (!feof(f))
 {
  fscanf(f,"%[^;];%s",str1);
  }
fclose(f);

Alguem sabe como posso fazer isto? Os elementos têm de ser obrigatoriamente "divididos" por ;

Posted (edited)
FILE * fp;
char buffer[516], * part;
int state = 0;

if ((fp = fopen("Redes.txt","r")) != NULL) {
 while (fgets(buffer, 516, fp)) {
   state = 0;
   part = strtok(buffer, ";");
   do {
     switch (state) {
       case 0: printf("nome  : %s\n", part); break;
       case 1: printf("local : %s\n", part); break;
       default: printf("unknown part : %s\n", part); break;
     }

     ++state;
   } while ((part = strtok(NULL, ";")) != NULL);
 }

 fclose(fp);
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

FILE * fp;
char buffer[516], * part;
int state = 0;

if ((fp = fopen("Redes.txt","r")) != NULL) {
 while (fgets(buffer, 516, fp)) {
   state = 0;
   part = strtok(buffer, ";");
   do {
     switch (state) {
       case 0: printf("nome  : %s\n", part); break;
       case 1: printf("local : %s\n", part); break;
       default: printf("unknown part : %s\n", part); break;
     }

     ++state;
   } while ((part = strtok(NULL, ";")) != NULL);
 }

 fclose(fp);
}

bem antes de mais deixa-me agradecer-te pela ajuda constante que tens disponibilizado.

Eu já tnha pensado numa soluçãio parecida no entanto pensei, e bem, que daria para fazer com o fscanf. O código funcional ficou assim:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{

   FILE *f;
   f = fopen("Redes.txt","r");
   if(f!=NULL){
   char infoLinha[357],str1[100],NomeRepetido='0';
  /* abre novamente para a leitura  */
while (!feof(f))
 {
  fscanf(f,"%[^;];%s;%s",str1,infoLinha);
  }
  printf("%s",str1);
fclose(f);
}
return 0;
}

No entanto a tua solução parece-me bastante melhor. Até porque a minha dá um warming no fscanf.

warning: format '%s' expects a matching 'char *' argument [-Wformat]|.

É possivel corrigir este warming?

Em relação a tua versão de codigo tenho uma duvida no do while.

Quando fazes } while ((part = strtok(NULL, ";")) != NULL); a variavel part ja tem o texto da linha certo? se tiver o nome1;local1 na primeira vez que passa no while apaga o nome1 certo? e o ; tambêm?

Posted

É possivel corrigir este warming?

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

int main()
{
 FILE *f;
 char infoLinha[357], str1[100], NomeRepetido='0';

 f = fopen("Redes.txt","r");
 if(f != NULL) {
   while (!feof(f)) {
     fscanf(f, "%100[^;];%357[^\n]\n", str1, infoLinha);
     printf("Nome : %s | Local : %s", str1, infoLinha);
   }

   fclose(f);
 }

 return 0;
}

Quando fazes } while ((part = strtok(NULL, ";")) != NULL); a variavel part ja tem o texto da linha certo? se tiver o nome1;local1 na primeira vez que passa no while apaga o nome1 certo? e o ; tambêm?

vê a documentação strtok

IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.