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



posted @ 2014-03-31 11:50  乾卦  阅读(2675)  评论(0编辑  收藏  举报