接下来就是一行行读column了。
?
因为column有多个,所以我们需要写循环语句 while(...)
循环语句的结束条件是什么呢,读到什么时候column就算读完了呢?
当然是要么文件结束,要么读到‘)’啦。
所以我们可以开头这样写
fscanf(fp,"%s",buffer); while (!feof(fp) && strcmp(buffer,")")) {
?while循环中每读到一次column就创建一个column对象。填充好。
而且column结构设计的时候我用链表结构。所以还要把每次创建的column对象连起来。
?
//接下去开始读column内容 Column * current = NULL; fscanf(fp,"%s",buffer); while (!feof(fp) && strcmp(buffer,")")) { //每次循环先创建一个column对象 Column * column = (Column *)malloc(sizeof(Column)); //清空column memset(column, 0, sizeof(Column)); //因为column是链表结构,所以必有一下几句 1)保留住链表头 2)把链表连起来 3)当前的指针往后移一个 if (t.columns == NULL) t.columns = column; if (current!=NULL) current->next = column; current = current->next;
?链表结构的创建一定要记住!1)保留住链表头 2)把链表连起来 3)当前的指针往后移一个
?
好了。到现在为止CREATE最复杂的部分实现了以后。接下来我们就轻松了。只要一个个内容读,读完了1保存在新创建的column中就可以了。
?
t.columnCount++; //第一次读应该读到 column name strcpy(column->name, buffer); //第二次读应该读到 column type(column length) fscanf(fp,"%s",buffer); getColumnTypeLength(buffer, &column->type, &column->length)==0; //第三次可能读到NULL; 可能读到; 这两种都代表着可以为空 fscanf(fp,"%s",buffer); if (strcmp(buffer,";")==0 || strcmp(strupr(buffer),"null;")==0) column->allowNull = 1; //第三次读也可能读到NOT,代表着不能为空 else if (stricmp(buffer,"not")==0) { //第四次读应该读到null; fscanf(fp,"%s",buffer); if (stricmp(buffer,"null;")) return 0; column->allowNull = 0; }
?这样一个column就都算完成了。继续往下读,完成循环
//继续读应该读到下一行内容了 fscanf(fp,"%s",buffer); } return 1;
?