2016-02-24 122 views
2

我用下面的代碼來解析這個CSVCSV解析 - 第二場返回空值

me;val1;val2;val3;val4;val5; 
me;val1;val2;val3;val4;val5; 

void readcsv() 
{ 
    FILE* stream = fopen("input.csv", "r"); 

    char line[1024]; 
    while (fgets(line, 1024, stream)) 
    { 
     char* tmp = strdup(line); 
     // printf("Field 1 would be %s\n", getcsvfield(tmp, 1)); 
     printf("Field 1 would be %s\n", getcsvfield(tmp, 1)); 
     printf("Field 2 would be %s\n", getcsvfield(tmp, 2)); 
     // NOTE strtok clobbers tmp 
     free(tmp); 
    } 
} 
//Used for parsing CSV 
const char* getcsvfield(char* line, int num) 
{ 
    const char* tok; 
    for (tok = strtok(line, ";"); 
      tok && *tok; 
      tok = strtok(NULL, ";\n")) 
    { 
     if (!--num) 
      return tok; 
    } 
    return NULL; 
} 

,但我一直在第二場

Output: 
Field 1 would be me 
Field 2 would be (null) 
Field 1 would be me 
Field 2 would be (null) 

越來越NULL值我即將做錯了什麼?

+0

是不是像'strtok()'修改輸入? –

+0

@SouravGhosh似乎它的問題。 – techno

回答

2

strtok(line,「;」);

strtok修改傳遞給它的字符串(在本例中爲line)。因此,在第二次撥打getcsvfield期間,您也不應使用相同的line(從第一次撥打電話到getcsvfield返回),因爲在第一次撥打getcsvfield後,line現在有不同的內容。

注意,這不是一個問題功能getcsvfield,因爲當你傳遞NULL第二次strtok功能,它知道如何與以正確的方式修改後的輸入字符串進行。

manualstrtok參數:

注意,這個串由被破碎成更小的 字符串(令牌)改性。

像這樣的東西應該做的伎倆。這是最「基本」的方法,你也可以嘗試其他的方法。離開getcsvfield功能您在代碼中有最初,只是在發送方做:

char line[1024]; 
char buffer[1024]; 
while (fgets(line, 1024, stream)) 
{ 
    // char* tmp = strdup(line); not necessary in this case 
    strcpy(buffer, line); 
    printf("Field 1 would be %s\n", getcsvfield(buffer, 1)); 
    strcpy(buffer, line); 
    printf("Field 2 would be %s\n", getcsvfield(buffer, 2)); 
    // free(tmp); 
} 

正如上面目前站,每次調用getcsvfield,返回poitner到相同的內存地址 - buffer。對於printing,它可以正常工作(因爲在打印時它顯示緩衝區中有什麼),但是如果要將每個調用的結果存儲爲getcsvfield以供以後使用,則可能需要將每次調用getcsvfield的結果複製到某些每次不同的內存位置。

+0

謝謝....你可以修改代碼嗎...我不擅長C# – techno

+0

@techno將'line'複製到getcsv字段中的臨時'buffer',並在該緩衝區上工作 –

+0

我只是做了編輯。 。之前,你刪除它:) ..我知道它不是一個有效的方式,我有關於它的另一個問題.. http://stackoverflow.com/questions/35594037/read-data-from-csv-and-put-into-數據庫中的答案不起作用。 – techno