tibsar - 1 year ago 79
C Question

# Reading Tab Separated Data In C99

I can give my program input files such as the following:

``````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
``````

Each of these lines represents a polynomial. For instance, the first line represents
`x^6 + 2x^2 - 1`

I am trying to read in this file but am not sure how to deal with the tabs and new lines. I am also not sure how to handle the fact that the amount of coefficients and polynomials can change.

Right now I have:

``````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 {

}

}
``````

My initial thought is to increment the size each time I need to, but I'm not sure if that's the best way to go about this.

My definition of
`polynomial`
is as follows:

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

I would like to return a list of polynomial structs. Any suggestions on how to go about this?

Read inputs into a linked list and then form the array when done.

Some quick code, lacking needed error checking, to get you started.

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

Inside the loop, read a line in the a buffer, parse it to a `polynomial` and append to the 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++;
}
``````

Allocate for the array

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

return polylist;
``````

Sub problem: More pseudo code to read tab separated data

``````  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
}
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download