2016-11-24 131 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); 
} 

我怎樣才能解決這個問題?我無法成功將csv中的100個客戶端的數據複製到結構中。

謝謝你!

+1

請發佈您的csv文件的前幾行。 –

+1

請同時添加關於您遇到的問題的描述 - 您的問題到目前爲止告訴我們您的目標和代碼,但並不表明您的問題可能是什麼! – Toby

+0

在你發佈的代碼中,你永遠不會調用'abrir',而是調用不存在的'menu'。 –

回答

1

這裏有三個主要問題:

  1. printf("%i, %s, %s, %s, ...)格式字符串不匹配的參數,你需要一個更%iprintf("%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更大的字段。