【问题标题】:Populating a Struct with a Binary file用二进制文件填充结构
【发布时间】:2014-09-28 05:15:32
【问题描述】:

我正在尝试反向读取二进制文件(“example.dat”)并使用其内容填充记录结构。该文件包含 10 条记录,每条记录有 3 种数据类型。

#include <iostream>
#include <fstream>

using namespace std;

/* Gross Yearly Income */
const unsigned long int GYI = sizeof( unsigned long int );

/* Amortization Period in years as an unsigned integer */
const unsigned int APY = sizeof( unsigned int );

/* Year ly interest rate in double precision */
const double annualInterest = sizeof( double );

/*This is where I attempt to determine the size of the file and most likely a huge fail. */

/* Attempting to obtain file size */
const int RECORD_SIZE = GYI + APY + annualInterest;

/* There are ten records*/
const int RECORDS = 10;

struct record_t
{    
    unsigned long int grossAnnualIncome;
    unsigned int amortizationPeriod;
    double interestRate;

} total[RECORDS]; // a total of ten records

void printrecord (record_t *record);

int main()
{   
    record_t *details = new record_t[RECORDS];

    ifstream file; /* mortgage file containing records */

    file.open( "mortgage.dat", ios::binary );

/*This for loop is an attempt to read the .dat file and store the values found into the relevant    struct*/

    for ( int i = 0; i < RECORDS; i++)
    {           
        file.seekg( -( i + 1 ) * RECORD_SIZE, file.end);
        file.read( ( char * )( &details[i].grossAnnualIncome ), GYI );
        file.read( ( char * )( &details[i].amortizationPeriod ), APY );
        file.read( ( char * )( &details[i].interestRate ), annualInterest );    

        cout << i << " : " ; printrecord(details);
    }

    file.close();       

    return 0;       
}    

/* Display the file records according to data type */

void printrecord (record_t *record)
{
    cout << record -> grossAnnualIncome << endl;
    cout << record -> amortizationPeriod << endl;
    cout << record -> interestRate << endl;
}

/* 感谢任何帮助和反馈。 */

【问题讨论】:

  • 那有什么问题?
  • 每条记录的输出始终为 749126312092639282, 1814962227, 1.26773e+213
  • 忽略您总是打印第一条记录的事实,1)您没有提供您编写文件的方式,以及 2)您是否验证了您编写的文件包含正确的数据。跨度>
  • 很遗憾我没有写文件;这使得验证其内容变得困难

标签: c++ struct binary ifstream seekg


【解决方案1】:

为什么你会得到如此奇怪的数字,例如我不能说我看到的利率。但是,您为每个条目获得相同值的原因是因为行

cout << i << " : " ; printrecord(details);

总是打印details 中的first 条目。如果您将其更改为:

cout << i << " : " ; printrecord(details + i); 

它将打印记录到details的实际值。


这样做的原因是数组的标识符将表现为指向数组第一个元素的指针。此外,您可以对该指针进行指针算术运算。因此以下两个语句是等价的。

details + i
&details[i]
// This last one is just for fun, but is actually also equivalent to the other two.
&[i]details

【讨论】:

  • 我可以通过在我的源代码中添加 details + i 来检索前两条记录。非常感谢。
  • 太好了,如果您喜欢这个答案,请随时点赞或接受。 :)
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多