2016-11-24 3 views
0

Ich muss die Daten aus einer CSV-Datei (Name, Adresse, Telefon ...) zu einer Struktur meines C-Programms. Es war leider erfolglos. Ich habe versucht, mit der STRTOK-Funktion jedes Mal, wenn ein ";" (weil es sich um eine kommagetrennte Datei handelt).Parsing CSV-Daten in Struktur

Hier ist, was ich getan habe:

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#define MAX_STR_LEN 256 
#define MAX_BOOKS 256 


struct estrutura 
{ 
    int id; 
    char nome[40]; 
    char endereco[40]; 
    char cidade[40]; 
    char pais[20]; 
    char cep[10]; 
    char nasc[12]; 
    char telefone[14]; 
    char total[20]; 
}; 

struct estrutura cliente[200]; 

FILE *pFile; 

//allocate buffer in each line 

char *buf = malloc(MAX_STR_LEN); 
char *tmp; 

void abrir(); 
/* Functions to be coded 
int menu(); 
int menu2(); //manutencao de clientes 
void adicionar(); 
void alterar(); 
void excluir(); 
void exibir(); 
void pesquisar(); */ 

main() 
{ 
    system("cls"); 
    abrir(); 
    //menu(); 
} 

void abrir() //open the csv file and copy it to 
{ 
    /* FileStream for the Library File */ 
    FILE *pFile; 

    /* allocation of the buffer for every line in the File */ 
    char *buf = malloc(MAX_STR_LEN); 
    char *tmp; 

    /* if the space could not be allocated, return an error */ 
    if (buf == NULL) { 
     printf ("No memory\n"); 
      } 

    if ((pFile = fopen("control.csv", "r")) == NULL) //Reading a file 
    { 
     printf("File could not be opened.\n"); 
    } 

    int i = 0; 
    while (fgets(buf, 255, pFile) != NULL) 
    { 
     if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n')) //checa leitura 
      buf[strlen (buf) - 1] = '\0';  

     tmp = strtok(buf, ";"); 
     cliente[i].id = atoi(tmp); //atoi for int 

     tmp = strtok(NULL, ";"); //use strcpy for char 
     strcpy(cliente[i].nome,tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].endereco, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].cidade, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].pais, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].cep, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].nasc, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].telefone, tmp); 

     tmp = strtok(NULL, ";"); 
     strcpy(cliente[i].total, tmp); 

     //tempBook.ID = atoi(buf); fix below 
     printf("%i, %s, %s, %s, %s, %s, %s, %s, %s \n",i, cliente[i].id , cliente[i].nome, cliente[i].endereco, cliente[i].cidade, cliente[i].pais, cliente[i].cep, cliente[i].nasc, cliente[i].telefone, cliente[i].total); 

     i++; 
    } 
    //free(buf); 
    fclose(pFile); 
} 

Wie kann ich dieses Problem lösen? Ich kann die Daten von 100 Clients im CSV nicht erfolgreich in eine Struktur kopieren.

Vielen Dank seit jetzt!

+1

Bitte schreiben Sie die ersten Zeilen Ihrer CSV-Datei. –

+1

Bitte fügen Sie auch eine Beschreibung des Problems hinzu, das Sie sehen - Ihre Frage sagt uns Ihr Ziel und den Code, zeigt aber nicht an, was Ihr Problem sein könnte! – Toby

+0

In dem Code, den Sie gepostet haben, rufen Sie nie 'abrir' auf, aber Sie rufen' menu' auf, das nicht existiert. –

Antwort

1

Es gibt drei Hauptprobleme:

  1. Der String-Format in printf("%i, %s, %s, %s, ...) nicht die Parameter übereinstimmen, müssen Sie eine weitere %i: printf("%i, %i, %s, %s, %s, ...).

  2. In Ihrem Code rufen Sie nie abrir(), aber Sie rufen menu(), die nicht existiert, daher Ihren Code nicht einmal kompilieren.

  3. Wenn Sie unter Windows (und nur dann) Sie benötigen fopen(..., "rt")) statt
    von fopen(..., "r"))

Ferner (nicht unbedingt der Probleme im Code verursacht):

char *buf = malloc(MAX_STR_LEN); kann durch char buf[MAX_STR_LEN]; ersetzt werden . Es ist sinnlos, Speicher dynamisch zuzuweisen, wenn die Speichermenge zur Kompilierungszeit bekannt ist. In diesem Fall müssen Sie natürlich nicht free(buf) anrufen (was sowieso auskommentiert ist).

Folgende Deklarationen kurz nach struct estrutura cliente[200]; sind nutzlos, Sie können sie entfernen.

FILE *pFile; 

//allocate buffer in each line 

char *buf = (char*)malloc(MAX_STR_LEN); 
char *tmp; 

Ansonsten sollte das Programm funktionieren, wenn Ihre Eingabedatei Felder hat, die in Ihrem struct estrutura größer als das Feld sind.