2017-07-03 59 views
2

我在使用函數getline /與fgets的問題,跳過輸入。我試圖從stdin讀取文件,然後處理它。雖然它的工作原理只是在openSUSE GCC 4.8.5細,它不Arch Linux的使用gcc 7和最新的Ubuntu與海灣合作委員會5後面的工作會簡單地跳過輸入幾行。 (我正在管道相同的文件)。在這個例子中,我的程序在管道時會跳過第三行和第四行,而手動輸入時則不會。與更大的文件相同的東西只有總是相同的行被跳過。有什麼想法嗎?不勝感激。謝謝。çfgets和函數getline從標準

輸入的形式爲(每行後跟一個換行符):

0 1 2 
2 3 4 
3 4 5 
2 4 5 
1 2 3 
1 
2 
3 

我的代碼如下所示:

int main(int argc, char *argv[]) { 

int bytes; 
size_t nbytes = 100; 
char *str = (char *) malloc(nbytes+1); // 1 byte for \0 
long i = 0; 
node *itemArray = malloc(sizeof(itemArray)); 

while ((bytes = getline(&str, &nbytes, stdin) != -1)) { 
    char* token; 
    char *rest = str; 
    int callNums = 0; 
    long from = 0; 
    long to = 0; 
    long weight = 0; 

    while((token = strtok_r(rest, " ", &rest))) { 
     if(callNums == 0) { 
      from = atol(token); 
        } 
     if(callNums == 1) to = atol(token); 
     if(callNums == 2) weight = atol(token); 
     callNums++; 
    } 

    if(callNums == 3) { 
     if(i == 0) { 
      itemArray[i].from = from; 
      itemArray[i].to = to; 
      itemArray[i].weight = weight; 
      printf("%li %li %li \n", itemArray[i].from, itemArray[i].to, itemArray[i].weight); 
     } 

     if(i > 0) { 
      node *tmp = realloc(itemArray, (i * sizeof(itemArray))); 
      if(tmp) { 
       itemArray = tmp; 
       itemArray[i].from = from; 
       itemArray[i].to = to; 
       itemArray[i].weight = weight; 
       printf("%li %li %li \n", itemArray[i].from, itemArray[i].to, itemArray[i].weight); 
      } 
      else { printf("realloc failed"); 
       exit(-1); } 
     } 
     ++i; 
    } 
    } 
    } 
    free(str); 
    free(itemArray); 
    return(0); 
} 
+0

你確定這個例子是代表?我沒有看到任何'fgets()'。 – EOF

+0

我將代碼從'fgets()'更改爲'getline',認爲我可以通過這種方式解決問題。無論我使用哪個代碼,我的代碼都會跳過這兩行代碼。我應該提到這一點。我很抱歉。 – markus

+0

,讓'getline'分配內存,我將添加隨機內容,其中實際讀取的輸入應該是。 – markus

回答

1

試試這個。通過將itemArray設置爲NULL,第一次調用realloc將像malloc一樣工作。將str設置爲NULL並將nbytes設置爲0應該可以在getline中正常工作。
的sscanf應努力從字符串進行掃描3個多頭。如果三個被成功掃描,他們將被添加到itemarray。

int main(int argc, char *argv[]) { 

    int bytes; 
    size_t nbytes = 0; 
    char *str = NULL; 
    long i = 0; 
    node *itemArray = NULL; 

    while ((bytes = getline (&str, &nbytes, stdin) != -1)) { 
     int callNums = 0; 
     long from = 0; 
     long to = 0; 
     long weight = 0; 

     if (3 == sscanf (str, "%ld%ld%ld", &from, &to, &weight)) { 

      node *tmp = realloc (itemArray, ((i + 1) * sizeof (*tmp))); 
      if(tmp) { 
       itemArray = tmp; 
       itemArray[i].from = from; 
       itemArray[i].to = to; 
       itemArray[i].weight = weight; 
       printf ("%li %li %li \n", itemArray[i].from, itemArray[i].to, itemArray[i].weight); 
      } 
      else { 
       printf("realloc failed"); 
       exit(-1); 
      } 
      ++i; 
     } 
    } 
    free(str); 
    free(itemArray); 
    return(0); 
} 
+0

非常感謝!這工作。 – markus