2013-04-02 58 views
1

我的程序要求我讀一個dat文件與數字的列表。我的目標是獲得每個數字並將它們添加到數組中。該文件具有這種格式的大約100號:讀取dat文件,並添加數字數組

(造型有點過抱歉;)

到目前爲止,我有

int main() 
{ 
    double prices[1000]; 
    int count,price; 

    FILE *file; 
    file = fopen("price.dat","r"); 
    if(file == NULL) 
    { 
     printf("Error: can't open file to read\n"); 
    } 
    else 
    { 
     printf("File prices.dat opened successfully to read\n"); 
    } 
    if (file){ 
     while (fscanf(file, "%d", &price)!= NULL){ 
      count++; 
      prices[count]=price; 
     } 
    } 
    fclose(file); 
} 

問題是它會不斷添加最後一個數字。任何幫助?

+0

'fscanf'不會返回NULL。請查看[文檔]中的返回值(http://pubs.opengroup.org/onlinepubs/007908775/xsh/fscanf.html)。 –

+0

而不是'null'使用'EOF',應該是這樣。另外,將你的計數設置爲0,而不是讓它隨機選擇一些內存字節。 – Shark

回答

2

你在你的代碼的幾個問題。僅舉幾例:

  • fscanf不返回一個指針,所以你不應該與NULL比較它。所有scanf函數都會返回一個整數,它可以是正數,零或負數。
  • 你不初始化count那麼它將包含一個看似隨機值。
  • 索引陣列開始爲零,所以你不應該增加數組索引count,直到分配之後。

不想停止的實際問題是由於第一點。

+0

感謝您的幫助!我仍然無法理解while循環應該等於還是不等於。我應該怎樣比較它? – dLiGHT

+0

@dLiGHT閱讀['fscanf'](http://en.cppreference.com/w/c/io/fscanf)參考,特別是關於其返回值的部分。 –

+0

我讀過它並理解它會返回它遇到的值的數量,如果它提前結束,則返回0;如果在第一次匹配失敗之前結束,則返回EOF。我一定是一個白癡,因爲沒有看到這個陳述假設不等於什麼; [ – dLiGHT

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

#define PRICES_LIST_MAX  1000 
#define PRICES_FILE   "price.dat" 

int main() 
{ 
    double prices[PRICES_LIST_MAX]; 
    int count = 0; 
    int i = 0; 

    FILE *file; 
    file = fopen(PRICES_FILE,"r"); 
    if(!file) 
    { 
     perror("Error opening file"); 
     return -1; 
    } 

    memset(prices, 0, sizeof(prices)); 
    while (!feof(file)    /* Check for the end of file*/ 
     &&(count < PRICES_LIST_MAX)) /* To avoid memory corruption */ 
    { 
     fscanf(file, "%lf", &(prices[count++])); 
    } 
    fclose(file); 

    /* Print the list */ 
    printf("Prices count: %d\n", count); 
    for(i = 0; i < count; i++) 
    { 
     printf("Prices[%d] = %lf\n", i, prices[i]); 
     } 

     return 0; 
}