2012-09-22 97 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适当。