2017-09-07 86 views
1

我有一個文件,它在一行中有任意數量的數字可以讀取爲整數。在一個最小的,可重複的例子,我創建了一個只包含以下行文件test.dat從文件中的一行中讀取任意數量的空格分隔的字符

1 2 3 4 

然後我嘗試使用fgetsstrtok來實現這一目標:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(){ 

FILE* fileptr; 

fileptr = fopen("test.dat","r"); 
char line[500]; 
char *token; 

int array[20]; 
int i = 0; 

fgets(line,300,fileptr); 

token = strtok(line," "); 
array[i] = atoi(token); 
printf("%d\n", array[i]); 
i++; 

while(token != NULL){ 
    token = strtok(line," "); 
    array[i] = atoi(token); 
    printf("%d\n", array[i]); 
    i++; 
} 

return 0; 
} 

但這會導致印刷21行1's,接着是0的632行。最後它給出了分段錯誤,因爲i增長大於20,分配的空間爲array。我不明白的是爲什麼會打印600多行文件,以及爲什麼我永遠無法讀取文件中的數字1以外的內容。我錯過了什麼?

注意:我更願意繼續閱讀文件fgets,因爲這將是對讀取整個文件的現有子程序的簡單修改。

+0

嗯,不清楚爲什麼在'與fgets(線,300,fileptr)300;'。我期望'fgets(line,sizeof line,fileptr);' – chux

+0

@chux沒有很好的理由 - 我沒有寫出原來的代碼來自哪一行。我會解決它。謝謝。 – sodiumnitrate

+0

如果目標是獲得「空格分隔的字符」,那麼'strtok()'很好。然而,由於該令牌立即運行atoi(),因此使用'strtol()'而不是'strtok()/ atoi()'更有意義,因爲[解析多個空格分隔的整數的字符串](https:/ /stackoverflow.com/q/28233450/2410359) – chux

回答

1

有幾件事情:

  • 你不限制你的環路的array
  • 你的循環中能夠幅度沒有妥善安排。所有的存儲應該在循環內完成;以前的異常值不需要在那裏。
  • 您在循環中調用strtok是錯誤的。 A 延續strtok的最初開始應指定NULL作爲第一個參數。有關更多信息和使用示例,請參閱strtok的文檔。

能夠解決這些問題的一個例子是在這裏:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE* fileptr = fopen("test.dat","r"); 
    if (fileptr == NULL) 
    { 
     perror("Failed to open file: "); 
     return EXIT_FAILURE; 
    } 

    char line[500]; 
    int array[20]; 
    const size_t max_size = sizeof array/sizeof *array; 
    size_t i = 0; 

    if (fgets(line,300,fileptr)) 
    { 
     char *token = strtok(line," "); 
     while (i < max_size && token != NULL) 
     { 
      array[i] = atoi(token); 
      printf("%d\n", array[i]); 
      ++i; 
      token = strtok(NULL, " "); 
     } 

     // use array and i for whatever you needed 
    } 

    return EXIT_SUCCESS; 
} 

輸出

1 
2 
3 
4 
+0

感謝您的詳細解答。在第一次通話之後將NULL傳遞給'strtok'的邏輯是什麼? – sodiumnitrate

+1

@sodiumnitrate請參見[strtok'的文檔](http://en.cppreference.com/w/c/string/byte/strtok)。它會做得比解決這個問題的目的要好得多,併爲您提供一個很好的網站,爲過程中的未來查詢添加書籤。 – WhozCraig

相關問題