fscanf用于读取字符串数据流,遇到空白字符(空格' '; 制表符' '; 新行符'
')就停止,若要读取完整的一行数据,可以使用格式控制("%[^
]%*c"),或者使用行读取函数(getline)。
格式控制说明:%[ ]表示读取指定字符集的文本,例如%[0-9]表示仅读取数字,遇到非数字字符就停止;%[a-zA-Z]表示读取字符,遇到非字母字符就停止)。第一个字符是'^',表示反向读取,读取指定字符集以外的文本,遇到指定字符集就停止。*表示忽略读取的字符,就是说读取指定的字符但不保存到变量中。
%[^
]表示读取'
'之外的所有字符;之后的%*c表示忽略读取的'
',就是说读取'
'但不保存。
%*[^
]%*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 ",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("====> [菜单] [输入数字1].符号查询 [输入数字2].名称查询 其他输入则退出程序 "); 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 名称:%s 原子序数:%d 密度:%.4f 熔点:%.1f 沸点:%d 比热容:%.3f 热焓:%.2f 热导率:%.2f 线胀系数:%.2f 电阻率:%.3f ",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这个元素! ",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 名称:%s 原子序数:%d 密度:%.4f 熔点:%.1f 沸点:%d 比热容:%.3f 热焓:%.2f 热导率:%.2f 线胀系数:%.2f 电阻率:%.3f ",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这个元素! ",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