为什么我的方法不从文件.txt读取浮点类型

时间:2013-12-06 11:00:03

标签: c++

我的输入文件:

QT, Quan Tri, 4
KT, Kinh Te, 4
DT, Dien Tu, 5
MT, My Thuat, 4.5
NN, Ngoai Ngu, 4

我的方法:

void ReadFileDT(fstream &file)
{
    char c;
    CarneerDT dt;
    int i=0;
    int t=0;// position attributes
    int k=0;
    char number[10];

    while(!file.eof())
    {           
        c=file.get(); //get a letter in the file
        //end of line processing
        if(c=='\n')
        {
            break;          
        }
        if(c!=',')
        {
            switch(t)
            {
            case 0: dt.id[i++]=c;break;
            case 1: number[k++]=c;break;
            case 2: number[k]=c;number[k+1]='\0';dt.year=atof(number);t++;break;            
            }
        }
        else
        {
            switch(t)
            {
            case 0:dt.id[i]='\0';break;
            case 1:number[k]='\0';strcpy(dt.name,number); k=0;break;        
            }           
            t++;        
        }           
    }

    cout<<endl;
    XuatDT(dt);

}
void ReadAllDT(char *tenfile)
{
    char c;
    fstream file;
    file.open("NganhDT.txt",ios::in);
    if(file.fail())
    {
        cout<<"File Error!";
        exit(1);
    }
    while(!file.eof())
    {
        ReadFileDT(file);       
    }
    file.close();
}

显示“运行时检查失败#2 - 变量'数字'周围的堆栈已损坏。”和年总是等于0.00000000000。我错了:“案例2:数字[k] = c;数字[k + 1] ='\ 0'; dt.year = atof(数字); t ++; break;”?

1 个答案:

答案 0 :(得分:1)

此代码结构略有错误

    if(c!=',')
    {
        switch(t)
        {
        case 0: dt.id[i++]=c;break;
        case 1: number[k++]=c;break;
        case 2: number[k]=c;number[k+1]='\0';dt.year=atof(number);t++;break;            
        }
    }
    else
    {
        switch(t)
        {
        case 0:dt.id[i]='\0';break;
        case 1:number[k]='\0';strcpy(dt.name,number); k=0;break;        
        }           
        t++;        
    }         

应该是

    if(c!=',')
    {
        switch(t)
        {
        case 0: dt.id[i++]=c;break;
        case 1: number[k++]=c;break;
        case 2: number[k++]=c;break;            
        }
    }
    else
    {
        switch(t)
        {
        case 0:dt.id[i]='\0';break;
        case 1:number[k]='\0';strcpy(dt.name,number); k=0;break;        
        case 2: number[k]='\0';dt.year=atof(number); k=0;break;            
        }           
        t++;        
    }         

但我必须承认,我不会立即明白为什么你的代码会导致堆栈损坏。