在C99中读取制表符分隔数据

时间:2016-10-24 14:36:26

标签: c file input io c99

我可以提供我的程序输入文件,如下所示:

1     0     0     0     2    -1
16    70  -169  -580    75
1     0     4     0    -5
0    -9     3     5    -3
5    -4     3    -2     0
1.0   -3.4    5.4531   -4.2077    1.5092   -0.2030

这些线中的每一条代表多项式。例如,第一行代表x^6 + 2x^2 - 1

我正在尝试阅读此文件,但我不确定如何处理标签和新行。我也不确定如何处理系数和多项式的数量可以改变的事实。

现在我有:

polynomial** readPolyFile(FILE *polyFile){
    polynomial *p = NULL; 
    int size = 1; /* Size to malloc */
    polynomial **polynomials = NULL; 

    polyList = malloc(sizeof(polynomial*) * size); /* Initialize */

    if(polyList == NULL){
        fprintf(stderr, "%s %n: Could not allocate memory\n", __FILE__, __LINE__);
        exit(-99); 
    }

    /* Read all of the data from the file */
    do {

    }

}

我最初的想法是每次需要时增加大小,但我不确定这是否是最好的方法。

我对polynomial的定义如下:

typedef struct
{
    unsigned int nterms;       /* number of terms */
    double complex *polyCoef;  /* coefficients    */
} polynomial;

我想返回一个多项式结构列表。关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:2)

  

有关如何解决这个问题的任何建议吗?

将输入读入链表,然后在完成后形成数组。

一些快速代码,缺少必要的错误检查,以帮助您入门。

设置空链接列表

typedef struct LL {
  polynomial *poly;
  struct LL *next;
} LL;
LL head = { NULL, NULL };
LL *p = &head;

在循环内部,读取缓冲区中的一行,将其解析为polynomial并附加到LL。

#define N 1000
count = 0;
char buf[N];
/* Read all of the data from the file */
while (fgets(buf, sizeof buf, polyFile)) {
  p->next = malloc(sizeof *(p->next));
  p = p->next;

  // TBD code for OP.
  // Hint: degree of polynomial < sizeof buf/2
  p->poly = polyList_from_line(buffer);

  p->next = NULL;
  count++;
}

为阵列分配

polyList = malloc(sizeof *polyList * count);
p = head.next;
for (i=0; i< count; i++) {
  assert(p);
  polylist[i] = p->poly;
  next = p->next;
  free(p);
  p = next;
}

return polylist;

子问题:更多伪代码读取制表符分隔数据

  polynomial *polyList_from_line(char *buffer) {
    double complex coef[some factor of N];
    count = 0;

    char *token = strtok(buffer, "\t");
    while (token)  {
      // parse the token for a complex number
      if (sscanf(buffer, tbd_format, tbd_variables) != expected_result)
        break;
      coef[count++] = ...
      token = strtok(tbd_code);
    }
    // Malloc polynomial using count
    // Populate polynomial from coef[]
    // return allocation
  }