2016-11-24 4 views
0

Я должен поместить данные из файла csv (имя, адрес, телефон ...) в структуру моей программы на C. К сожалению, это было неудачно. Я попытался использовать функцию strtok, чтобы разбить токены каждый раз, когда находит «;» (потому что мы имеем дело с разделенным запятыми файлом).Анализ данных CSV в структуре

Вот что я сделал:

#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); 
} 

Как я могу решить эту проблему? Я не могу успешно скопировать данные из 100 клиентов в csv в структуру.

Спасибо, что сейчас!

+1

Пожалуйста, разместите первые несколько строк вашего файла csv. –

+1

Пожалуйста, также добавьте описание проблемы, которую вы видите, - ваш вопрос до сих пор говорит нам о вашей цели и коде, но не указывает, какова может быть ваша проблема! – Toby

+0

В коде, который вы отправили, вы никогда не называете 'abrir', но вы вызываете' menu', которого не существует. –

ответ

1

Есть три основные проблемы здесь:

  1. Строка формата в printf("%i, %s, %s, %s, ...) не соответствующие параметрам, вам нужен еще один %i: printf("%i, %i, %s, %s, %s, ...).

  2. В коде вы никогда не звоните abrir(), но вы вызываете menu(), которого не существует, поэтому ваш код даже не компилируется.

  3. Если вы на Windows, (и только тогда), вам необходимо fopen(..., "rt")) вместо
    из fopen(..., "r"))

Кроме того (не вызывает актуальных проблем в коде):

char *buf = malloc(MAX_STR_LEN); можно заменить char buf[MAX_STR_LEN]; , Нет смысла выделять память динамически, если объем памяти известен во время компиляции. В этом случае вы, конечно, не должны звонить free(buf) (который в любом случае прокомментирован).

Следующие объявления после struct estrutura cliente[200]; бесполезны, вы можете удалить их.

FILE *pFile; 

//allocate buffer in each line 

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

В противном случае программа должна работать нормально, если ваш входной файл не имеет поля, которые больше, чем поле в вашем struct estrutura.

Смежные вопросы