fscanf的用法
fscanf用于读取字符串数据流,遇到空白字符(空格' '; 制表符'\t'; 新行符'\n')就停止,若要读取完整的一行数据,可以使用格式控制("%[^\n]%*c"),或者使用行读取函数(getline)。
格式控制说明:%[ ]表示读取指定字符集的文本,例如%[0-9]表示仅读取数字,遇到非数字字符就停止;%[a-zA-Z]表示读取字符,遇到非字母字符就停止)。第一个字符是'^',表示反向读取,读取指定字符集以外的文本,遇到指定字符集就停止。*表示忽略读取的字符,就是说读取指定的字符但不保存到变量中。
%[^\n]表示读取'\n'之外的所有字符;之后的%*c表示忽略读取的'\n',就是说读取'\n'但不保存。
%*[^\n]%*c表示跳过一行。
fscanf(fp,"%[^,],%s",buf,buf2);
/* * 注意:file.txt文件中元素属性的格式为: * 符号(西文逗号)名称(空格)原子序数(西文逗号)密度(西文逗号)熔点(西文逗号)沸点(西文逗号)比热容(西文逗号)比焓(西文逗号)热导率(西文逗号)线胀系数(西文逗号)电阻率(西文逗号) * 例子: * Cu,铜 29,8.96,1087,2580,0.385,211.86,393.56,17.0,1.675 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 4 typedef struct //定义元素结构体 elements { char sym[3]; //符号 char name[5]; //名称 int atomic; //原子序数 float den; //密度 float mel; //熔点 int boil; //沸点 float shc; //比热容 Specific heat capacity float se; //比焓 Specific enthalpy float tc; //热导率 Thermal conductivity float cle; //线胀系数 Coefficient of linear expansion float res; //电阻率 Resistivity }elements; int main() { FILE *fp; elements elem[MAX]; int i,k; int ret=0; char symbol[3]; char name[5]; if((fp = fopen("E:\\file.txt","rb")) == NULL) return -1; memset(elem,0,sizeof(elements)*MAX); //初始化结构体数组,全部填0 for(i=0;i<MAX;i++) fscanf(fp,"%[^,],%s %d,%f,%f,%d,%f,%f,%f,%f,%f\r\n",elem[i].sym,elem[i].name,&(elem[i].atomic),&(elem[i].den),&(elem[i].mel),&(elem[i].boil),&(elem[i].shc),&(elem[i].se),&(elem[i].tc),&(elem[i].cle),&(elem[i].res)); while(1) { printf("====> [菜单] \n[输入数字1].符号查询\n[输入数字2].名称查询\n其他输入则退出程序\n"); scanf("%d",&k); if(1==k) //按照符号查询 { scanf("%s",symbol); for(i=0;i<MAX;i++) //遍历 { if(strcmp(symbol,elem[i].sym)==0) //如果找到 { break; } } if(i!=MAX) //如果找到则输出 { printf("符号:%s\n名称:%s\n原子序数:%d\n密度:%.4f\n熔点:%.1f\n沸点:%d\n比热容:%.3f\n热焓:%.2f\n热导率:%.2f\n线胀系数:%.2f\n电阻率:%.3f\n",elem[i].sym,elem[i].name,elem[i].atomic,elem[i].den,elem[i].mel,elem[i].boil,elem[i].shc,elem[i].se,elem[i].tc,elem[i].cle,elem[i].res); } else printf("未找到%s这个元素!\n",symbol); } else if(2==k) //按照名称查询 { scanf("%s",name); for(i=0;i<MAX;i++) //遍历 { if(strcmp(name,elem[i].name)==0) //如果找到 { break; } } if(i!=MAX) //如果找到则输出 { printf("符号:%s\n名称:%s\n原子序数:%d\n密度:%.4f\n熔点:%.1f\n沸点:%d\n比热容:%.3f\n热焓:%.2f\n热导率:%.2f\n线胀系数:%.2f\n电阻率:%.3f\n",elem[i].sym,elem[i].name,elem[i].atomic,elem[i].den,elem[i].mel,elem[i].boil,elem[i].shc,elem[i].se,elem[i].tc,elem[i].cle,elem[i].res); } else printf("未找到%s这个元素!\n",name); } else return 0; } return 0; }
E:\file.txt 内容:
Ag,银 47,10.49,960.8,2210,0.234,104.67,418.7,19.7,1.59
Cu,铜 29,8.96,1087,2580,0.385,211.86,393.56,17.0,1.675
Al,铝 13,2.6984,660.1,2500,0.900,369.09,221.9,23.6,2.655