2

我有一个可能很简单的问题。我必须将一些python代码转换为c,而我对c的经验并不丰富。

我在 python 中循环读取一个文件,逐行读取它。如果该行中有某个标记,我必须将其拆分并将值读入一个 int 数组。然后将该数组用于进一步处理。此处给出了一个文件示例:

Event   163
Time    29-05-2013, 11:41:45
TDC1.HEX_B  927532 1460340
TDC1.HEX_F   -1
TDC1.HEX_x1 930080 1462311
TDC1.HEX_x2 929198 1462611
TDC1.HEX_y1 1462957
TDC1.HEX_y2 928628 1462151
TDC1.HEX_z1 929097 
TDC1.HEX_z2 930314 1462992
TDC1.Trigger    1728347
errors  0 0 0 0
proc_time   40
%
Event   500

现在我的问题是我不知道每一行中会有多少整数。在 python 中,我可以做这样的事情:

if 'TDC1.HEX_B' in line: 
    numbers_str = line.split()[1:] # use all the words except the first
    B = [ float(x) for x in numbers_str ]

在此示例中,B 将是一个列表,其中长度对应于 numbers_str 中的数字计数。在 c 中是否有类似的可能性来分配一个足够长的数组?稍后在处理数据时,我必须遍历数组。我已阅读有关 malloc() 和 realloc() 的信息。他们有帮助吗?如果是这样,是否有很好的资源来阅读它们?我是否可能必须先阅读该行,然后为该行中的整数数量分配一个数组?

4

2 回答 2

2

如果您可以使用 C++,您可能会发现std::vector更易于使用。如果你必须坚持使用 C,你可以 malloc 一个初始大小的数组,并使用一个 int 来跟踪它的大小和它有多满。然后每次添加到数组时检查是否要溢出它,如果是,则重新分配它以使其容量更大(例如每次 x2)。

一些代码:

int initialSize=2;
int size=initialSize;
int nElements=0;
int* myArray=malloc(initialSize*sizeof(int));

//Do some line-by-line parsing

//Found a token
int token; //You set this

if(nElements==size)
{
    size=size*2;        
    myArray=realloc(myArray, size*sizeof(int));
}

myArray[nElements]=token;
nElements++;
于 2013-09-23T12:53:56.360 回答
0

malloc()realloc()如果您不知道需要多大的阵列,这就是您所需要的。用于malloc()在开始时分配内存。将一个变量保留为当前分配的内存大小,将另一个变量保留为到目前为止存储的值的数量。当您存储了最大数量的值时,使用realloc()以获得更大的内存区域。

于 2013-09-23T15:12:06.737 回答