Leudassdf Posted February 12, 2014 at 12:02 PM Report #545004 Posted February 12, 2014 at 12:02 PM 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 ;
HappyHippyHippo Posted February 12, 2014 at 12:10 PM Report #545007 Posted February 12, 2014 at 12:10 PM (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 February 12, 2014 at 12:12 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 12, 2014 at 12:25 PM Author Report #545011 Posted February 12, 2014 at 12:25 PM 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?
HappyHippyHippo Posted February 12, 2014 at 12:33 PM Report #545015 Posted February 12, 2014 at 12:33 PM É 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 Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now