使用atof C ++转换char数组中的float

时间:2014-05-24 21:02:54

标签: c++ file binary atof

我一直在寻找类似的问题,但我仍然无法找到解决问题的方法。

我正在获取一个文本文件并将其转换为二进制文件,以便在另一个程序中使用。另一个程序编译并输出一切都很好,但问题似乎在于我的文件转换。

void makefile( ifstream & fi, ofstream & fo ){
    struct{
        int acct;
        char name[25];
        float dolr;
    } x;

    int i;
    char line[81], *p, *q;

    while ( fi.getline( line, 81 ) ) {
        x.acct = atoi( line );
        p = line;
       while ( *p++ != ' ' );
        for ( q = x.name, i = 24 ; i-- ; ){
            *q++ = *p++;                    // *q = '\0';
        }
        while ( *--q == ' ' );              // find end of string

        *++q = '\0';                        // mark end of name string
        x.dolr = atof(p);
        fo.write( (char*)&x, sizeof(x) );
    }
}

输入文本文件如下所示......

000027183 Hun, Attila The       1234.56
000012345 Dooright, Dudley      211.22
000031416 Whiplash, Snidely     1200.00
000014142 Jekyll, Doctor        1500.00
000031623 Hyde, Mister          1500.00
000010203 Bear, Smokey The      2000.00
000020103 Dumpty, Humpty        3000.00
000030102 Woman, Wonder         3824.36
000030201 Hulnk, Incredible     9646.75
000022345 Snowman, Abominable   2496.24

当我运行程序并检查二进制文件(使用单独的程序)时,我可以看到转换后的文件,但它看起来像这样:

 27183  Hun, Attila The         1234.56         0.00
 12345  Dooright, Dudley        211.22         0.00
 31416  Whiplash, Snidely       1200.0        0.00
 14142  Jekyll, Doctor          1500.00          0.00
 31623  Hyde, Mister                1500.00           0.00
 10203  Bear, Smokey The        2000.00        0.00
 20103  Dumpty, Humpty          3000.00          0.00
 30102  Woman, Wonder               3824.36          0.00
 30201  Hulnk, Incredible       9646.7        5.00
 22345  Snowman, Abominable     2496        0.24

这最初是用C编写的,我开始怀疑这是否反映在我的教授给我们制作二进制文件的代码中。有什么建议吗?

更新:这是其他程序中读取文件“检查”的功能

void
chkfile( ifstream & f ){

struct {
    int acct;
    char name[25];
    float dolr;
} x;


while ( f.read( (char *)&x, sizeof(x) ) ){
    cout << setfill('0') << setw(9) << x.acct << "  ";
    cout.setf( ios::left, ios::adjustfield );
    cout << setfill(' ') << setw(26) << x.name;
    cout.setf( ios::right, ios::adjustfield );
    cout.setf( ios::fixed, ios::floatfield );
    cout.setf( ios::showpoint );
    cout.precision(2);
    cout << setw(10) << x.dolr << '\n';
}
}

1 个答案:

答案 0 :(得分:0)

更新:原来问题不在代码中,而是在用于创建二进制文件的文本文件中。我正在使用制表符来区分名称和金额,因此在转换为二进制时解析已关闭。我使用了空格,这解决了我的问题!