2016-03-18 51 views
0

我正在處理一個項目,我需要對文件中的某些數據進行排序。該文件是一個由「標籤空間」分隔的字符串的長長的列表(我認爲該文件分隔我不知道,但)。這裏是文件的一行的一個示例:令牌存儲不當?文件解析的問題

2986043產品圖德字體Blanca的產品圖德字體Blanca的產品圖德字體布蘭卡,PIC杜端口42.64991 1.53335ŤPK AD

在中間的兩個雙打(E/g:42.64991 & 1.5335),這是我關心的問題,因爲我將它們存儲起來並在以後使用它們進行排序。這只是一個使用前1000行輸入數組的原型,但實際文件大小卻在數百萬行中。實際的數據結構將是某種鏈接列表(我認爲?不知道最適合這種工作的最適合)

這裏是一組循環,我從文件指針中標記字符串,並嘗試在字符串複製到指針數組我已經設置了:

int curr_line=0; 
    int longlat; 
    char* coord[1000][2]; 

    /* clock starts to time process 
    * this pair of loops works through each line of the file, token by token 
    * 
    */ 
    start = clock(); 
    while(fgets(duff, 512, (FILE*)fp) !=NULL) 
    { 
     int coordFlag=0; 
     //char* token=strtok(duff, " "); 
     char* token=strtok(duff, " \t"); 
     while(token) 
     { 
     if(verify(token)) 
     { 
      //printf("tok: %s\n", token); 
      coordFlag++; 
      if(coordFlag==1) 
      { 
       printf("%s||", token); 
       strcpy(coord[curr_line][0], token); 

      } 
      if(coordFlag==2) 
      { 
       printf("%s\n", token); 
       strcpy(coord[curr_line][1], token); 

      } 
     } 
     //printf("tok: %s\n", token); 

     token=strtok(NULL, " \t"); 


     } 
     curr_line++; 
     if(curr_line==1000) break; 

    } 

目前,我會遇到程序崩潰,因爲它試圖存儲第一個字符串運行時錯誤。我相信我錯誤地使用數組,和/或字符串指針和字符串。

我的主要目標是解析由空白和分隔標籤字符分隔的字符串行,並抓取中間的兩個字符串,即經度和緯度,並將它們存儲在數組中。

作爲一個後續問題,這個存儲怎麼可以做雙打。在中,我可以解析令牌,然後創建一個空白的雙變量,複製解析的令牌並將其作爲帶有類型轉換的雙精度或者更高效的策略來存儲?

+0

@ bmm6o但根據其餘的代碼,它不應該這樣做。 – MikeCAT

回答

1

您正在使用未初始化且無意義存儲令牌的指針,這非常糟糕。

在複製字符串之前分配用於存儲令牌的緩衝區。

if(coordFlag==1) 
{ 
    printf("%s||", token); 
    coord[curr_line][0] = malloc(strlen(token) + 1); // add this line 
    strcpy(coord[curr_line][0], token); 

} 
if(coordFlag==2) 
{ 
    printf("%s\n", token); 
    coord[curr_line][1] = malloc(strlen(token) + 1); // add this line 
    strcpy(coord[curr_line][1], token); 

} 

注:

  • 不要忘記+1對終止空字符。
  • 添加一些代碼來檢查malloc()是否成功並處理錯誤會使此代碼更好。