Ir ao conteúdo

Posts recomendados

Postado

Opa, beleza?

Estou fazendo um trabalho pra faculdade, onde eu preciso ler o arquivo ordenar os dados no programa e imprimir na tela.

Por algum motivo o meu programa está quebrando, não consigo achar o motivo.

Esse é o arquivo que quero ler.

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

// Structs
typedef struct{
    char *Terra;
    char *Etnia;
    char *Uf;
    char *Municipio;
    double Superficie;
    char *Fase;
    char *Modalidade;
}Dados;
// Declarações de funções
void LerArquivo(FILE *file);
// Função principal
int main(void){
    char buf[1024];
    char *field;
    Dados dado[727];

    setlocale(LC_ALL, "");

    FILE *file = fopen("rf_conservacao_terrasindigenas_estados_2017.csv", "r");

    if(!file){
        printf("Não foi possivel abrir arquivo!\n");
        return 1;
    } else {
        printf("Arquivo aberto!\n");
        system("Pause");
        printf("\n");
        int row = 0;
        int field_count;
        int index = 0;

        while(fgets(buf, 1024, file)){
            field_count = 0;
            row++;

            if (row == 1){
                continue;
            }

            field = strtok(buf, ";");
            while(field){
                // Achei que seria melhor utilizar o switch pois não precisaria verificar todas as opções.
                switch (field_count){
                    case 0:{
                        dado[index].Terra = field;
                        break;
                    }
                    case 1:{
                        dado[index].Etnia = field;
                        break;
                    }
                    case 2:{
                        dado[index].Uf = field;
                        break;
                    }
                    case 3:{
                        dado[index].Municipio = field;
                        break;
                    }
                    case 4:{
                        dado[index].Superficie = (double) *field;
                        break;
                    }
                    case 5:{
                        dado[index].Fase = field;
                        break;
                    }
                    case 6:{
                        dado[index].Modalidade = field;
                        break;
                    }
                }

                printf("%s\n", field);

                field = strtok(NULL, ";");

                index++;
                field_count++;
            }
        }
    }
    fclose(file);

    return 0;

 

Postado

Olá

 

Há vários tópicos sobre esse mesmo problema nesse mesmo forum. Veja o tópico de ontem que tem links para uma solução que postei. E alguns comentários que se aplicam também ao seu programa

 

Sobre seu programa

 

Porque postou um link para uma planilha que tem os dados? E porque importou como texto?

Talvez não tenha entendido o propósito de um arquivo csv...

 

De todo modo seria melhor para quem quer te ajudar se você tivesse postado algumas linhas do arquivo direto aqui, certo?

Assim não seria preciso eu abrir um link pra abrir uma planilha onde o arquivo csv sequer foi importado...

Veja a diferença:

TERRA INDНGENA;ETNIA;UF;MUNICНPIO;SUPERFНCIE(ha);FASE DO PROCEDIMENTO;MODALIDADE
Acapuri de Cima;Kokama;AM;Fonte Boa;19.885,04;Declarada;Tradicionalmente ocupada
Acimг;Apurinг;AM;Lбbrea;40.686,03;Regularizada;Tradicionalmente ocupada
Aconг;Tingui-Botу;AL;Traipu;267,7862;Encaminhada RI;Reserva Indнgena
Бgua Preta/Inari;Apurinг;AM;Pauini;139.763,67;Regularizada;Tradicionalmente ocupada
Бguas Belas;Pataxу;BA;Prado;1.189,06;Regularizada;Tradicionalmente ocupada
Бguas Claras;Guarani Mbya;SC;Major Gercino;165,4162;Regularizada;Reserva Indнgena

Veja como funciona isso num programa na prática

 

Em EXCEL

 

image.png.c520d5e8925b92663207cafc2a605b8c.png

 

No Google Planilhas 

image.png.8f89185d81f0d3bfe36fbc48600d6291.png

 

Esse é o propósito de um arquivo csv: um formato de intercâmbio. Você não abre a planilha com o csv perdido lá dentro. Você cria uma planilha a partir dos dados. Com um comando só.

 

Ou importa para o banco de dados. Qualquer um. Ou imprime etiquetas com seu programa de mala direta a partir do csv

 

É para isso.
 

De volta ao seu programa

 

image.png.071ffaf32653ca81ac499392ca8ce121.png

 

 

Pois é: não precisa mesmo verificar todas as opções. Mas não precisa verificar nenhuma.

 

Você pode apenas ler as linhas para a memória. Você já sabe o que quer fazer. Pra que ler os campos? Não vai classificar pelo primeiro campo como todos os outros tópicos aqui? Ou por um campo fixo?


Algo simples assim já serviria:

typedef struct
{
    char   C[30]; // o campo para classificar
    char   L[200]; // e a linha

}   Registro;


typedef struct
{
    int N;
    Registro R[300];

}    CSV;

CSV		tabela;

E use insertion sort enquanto lê... Assim ao final o arquivo estará classificado.

Citação

Não faz sentido ler tudo sem processar para depois processar tudo de novo para classificar

 

E o que houve com a função Ler_arquivo?

 

Sobre esse trecho...

    while (fgets(buf, 1024, file))
    {
        field_count = 0;
        row++;

        if (row == 1) {
            continue;
	}

Não acha esquisito demais? Depois do primeiro registro nunca mais vai ler o primeiro registro, mas vai testar toda vez...

 

Não podia ter ao menos escrito

	fgets(buf, 1024, file); // a linha dos headers
	while (fgets(buf, 1024, file))
	{
        	field_count = 0;
        	row++;

	// ...
      
	}

?

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!