2012-09-22 134 views
-1

我想讀取包含我的代碼的座標值的文件。如何動態增加數組大小

我的問題是,我如何使數組大小足夠大,以包含將來添加到文件?

以下是我的代碼;當我將數組設置爲905的大小時,我的循環繼續,直到空間填滿。這是爲什麼?

FILE.txt

S (60,70)(200,200) 
S (30,40)(100,200) 
S (10,20)(80,10) 
S (60,400)(700,200) 
S (160,70)(240,20) 
S (160,70)(240,20) 
S (160,70)(240,20) 

我的代碼:

#include <stdio.h> 
int a; 
int b; 
int c; 
int d; 
int data[905][4]; 
int main (int argc, char *argv[]) 
{ 
    if (argc != 2) /* argc should be 2 for correct execution */ 
    { 
     /* We print argv[0] assuming it is the program name */ 
     printf("usage: %s filename", argv[0]); 
    } 
    else 
    { 
     // We assume argv[1] is a filename to open 
     FILE *file = fopen(argv[1], "r"); 

     /* fopen returns 0, the NULL pointer, on failure */ 
     if (file == 0) 
     { 
      printf("Could not open file\n"); 
     } 
     else 
     { 
      int j=0;int count=1 
      for (j=0; j < count; j++) 
      {  
       fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d); 

       printf("%d,%d,%d,%d\n",a, b, c, d); 
       count++ 
      }    

      fclose(file); 
     } 
    } 
} 
+2

請嘗試找到一個最簡單的例子,它不清楚你的意思,想要什麼,或者做錯了什麼......總的來說,你會調用'realloc()'或者做類似的事情.. –

回答

-2

的爲什麼一點 - 你寫的代碼 - 這是很容易

問題的thust是,你不能。使用的(比如說)1024個整數

+1

感謝你們所有人............解決了這個問題....通過增加一個時間來改變我的循環結構()!= EOF;內部爲循環。 –

+0

@IgbeChukwudi很高興爲您服務 –

1

鏈表隨着

int j=0;int count=1 
for (j=0; j < count; j++) 
{ 

    fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d); 

    printf("%d,%d,%d,%d\n",a, b, c, d); 
    count++ 
} 

你有一個循環,保持比jcount一個直到count++溢出,給你不確定的行爲。編譯器可能會忽略循環控制並使其成爲一個無限循環,因爲它可能會假定沒有未定義的行爲發生。

因此,循環嘗試從文件中讀取值而不是結束,或者至少很長一段時間。到達文件結尾時,fscanf不會讀取任何值,但由於您不檢查其返回值,所以不會停止循環。爲了避免這種情況,你可以不喜歡

if (fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d) < 4) { 
    break; 
} 

,使循環結束時,到達文件的末尾,或者發生輸入錯誤。

關於

如何使數組大小足以容納未來除了文件?

那麼你不應該使用與靜態定義的維數的數組,但使用malloc

int (*data)[4] = malloc(num_rows * sizeof *data); 

分配空間,當你需要更多的,

int (*temp)[4] = realloc(data, new_num_rows * sizeof *data); 
if (temp == NULL) { 
    // reallocation failed, handle it or exit 
} else { 
    data = temp; 
} 

realloc較大的內存塊。

+0

+1指出「無限」(直到你溢出計數)循環。我自己甚至都沒有回答這個問題,也沒有解決這個顯而易見的問題。 –

1

您需要爲此使用和realloc函數<stdlib.h>。基本思路是先分配一定的空間,然後在發現陣列不夠大時放大陣列。

這將讓生活更容易,如果你使用結構的數組,而不是數組的數組:

struct segment { int x0, y0, x1, y1; }; 

,然後你做這樣的事情:

size_t nsegs = 0, segs_allocated = 10; 
struct segment *segs = malloc(segs_allocated * sizeof(struct segment)); 
if (!segs) abort(); 

while (getline(&line, &linesz, stdin) >= 0) 
{ 
    if (!parse_line(&segs[nsegs])) continue; 
    nsegs++; 
    if (nsegs == segs_allocated) 
    { 
     segs_allocated *= 2; 
     segs = realloc(segs, segs_allocated * sizeof(struct segment)); 
     if (!segs) abort(); 
    } 
} 

強制性切評論:忘記你曾經聽說過fscanf。這比它值得的更麻煩。使用getline(如果您沒有它,實現起來並不難)從整行讀取整行,並使用手工編碼的解析器從行中提取單個數字字符串,然後將它們轉換爲與機器整數strtolstrtoulstrtod適當。