【问题标题】:Dynamic allocation of array in C, when reading a file with lines of unknown data lengthC中数组的动态分配,当读取具有未知数据长度的文件时
【发布时间】:2013-09-23 12:47:01
【问题描述】:

我有一个可能很简单的问题。我必须将一些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() 的信息。他们有帮助吗?如果是这样,是否有很好的资源来阅读它们?我是否可能必须先读取该行,然后为该行中的整数数量分配一个数组?

【问题讨论】:

  • 我建议在尝试编写 C 代码之前阅读一本关于 C 的书...您所问的内容在我看来就像基本的 C 编码。
  • @ErikAllik:多么无意义的评论!
  • 还要考虑是否真的值得用 C 进行编码。也许有一种方法可以用 Python 脚本读取数据,然后将实际处理交给 C 以加快速度(因为,除非你在你的文件中有数千行,并且你需要执行它数千次,你不会从用 C 编码这部分获得任何好处;即使这样,它在 Python 中可能已经足够快了)。
  • 现在我有 500 个文件,每个文件大约 2000 行,这就是我想切换到 c 的原因。我也在看 ctypes..
  • 在我的机器上进行快速测试需要半秒钟才能读取 500 个这样的文件,共 2000 行。这不是减速,而且真的不值得玩弄 malloc/realloc 的痛苦,所以您可能要考虑在 Python 中执行 I/O,然后以二进制格式或数据库格式存储 B。然后,您可以找到一种方便的方法在您的 C 程序中读取 B,该方法将执行实际的、缓慢的计算(“方便”意味着您提前知道 B 有多少个浮点数,例如,存储 @ 的长度987654326@ 也是)。

标签: python c arrays


【解决方案1】:

如果您可以使用 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++;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 2015-08-01
      • 2022-01-07
      • 2011-07-04
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多