2013-12-14 73 views
-1

我在我的程序的第一步失败。首先,我需要从文件读入一个结构数组。我没有做到这一点 - 我得到了很多错误,我感觉我的阅读语法不正确。一旦我这样做,我将能够继续我的程序。我认为我必须使用calloc/realloc/free和所有这些奇怪的东西,因为我的数据文件可能有很长的一组数字。C - 数组,从文件读取结构数组(calloc realloc免费...)

我的数据文件:

4 5 5 6 
9 
5 7 6 9 
6 5 
1 8 1 2 3 6 5 
1 9 
4 5 5 6 
9 
5 7 6 9 
6 5 
1 8 1 2 3 6 5 
1 9 

它必须读起来像坐标(x,y)的 - 不要紧,这些数字是如何放置 - 我可以/必须跳读

+3

我不明白文件的格式。你说(x,y)坐标,但行有不同数量的数字 – slezica

+0

'calloc'函数返回一个指向一些分配内存的指针,但'Trikamp'没有被声明为一个指针。改为使用'Struct Trikampiai * Trikamp;'声明,将其注释掉。你需要使用'Trikamp-> stuff'而不是'Trikamp.stuff'。 'main'的返回类型应该是'int',而不是'void'。你的代码缩进也有点怪异。 – 2013-12-14 13:52:10

回答

1

你使用calloc是不正确的。正如赫尔曼在他的评论中指出的那样,调用calloc会返回一个指向内存块sizeof(struct Trikampiai)字节长度的指针;你正在存储一个int指针。此外,您从不使用字符数组buf

尝试:struct Trikampiai *Trikamp = calloc(1, dydis);,如果你想动态分配内存,或者只是保持struct Trikampiai Trikamp;如果你想自动分配。从我可以告诉你的程序的意图你混淆了这两个内存分配的概念(堆栈vs堆)。这是一个很好的资源:What and where are the stack and heap?

Trikamp->xas = sk; VS Trikamp.xas = sk

与前你必须使用->操作符来访问结构,而后者则需要.运营商,这是我认为你想要。

你还看到了什么其他错误?

1

您需要一个长度和一个计数索引。两者在开始时可以设置为零。在循环中,如果长度等于计数指标,您可以通过一些合理的量增加长度,不能太小,不能过大,并使用增加的长度

if(count==length) { 
    length += delta; 
    trikamp = (struct Trikampiai *)realloc(trikamp, dydis*length); 
} 

您可以访问调用的realloc的trikamp阵列该结构的字段为(trikamp+count)->xas或等同于trikamp[count].xas,编译器将两者视为相同。