将结构成员写入二进制文件,并使用fstream和C++; 对于C++的世界来说还是新的,下面的问题是因为作业分配!我没有在搜索之前回答的问题或谷歌上找到太多帮助,这并不意味着我没有错过它

将结构成员写入二进制文件,并使用fstream和C++; 对于C++的世界来说还是新的,下面的问题是因为作业分配!我没有在搜索之前回答的问题或谷歌上找到太多帮助,这并不意味着我没有错过它,c++,binaryfiles,fstream,C++,Binaryfiles,Fstream,家庭作业的目标: 1.)获取用户输入信息并将其存储在二进制文件中。 2.)稍后将该数据读回 我有一个多达10个结构的数组,该结构采用用户名的字符数组、用户电话号码的字符数组和浮动工资。当我输入几个测试用例时,文件写入,我的假设是正确的。当我去读取中的值时,第一个名字会像第一个电话号码一样打印出来。不管我在测试用例中输入了什么值,float都会给我-4013602080。从那里开始走下坡路。我正在尝试使用这个我的问题归结为两个部分,我是否“正确”地将结构成员写入文件,以及如何从二进制文件读取浮点值

家庭作业的目标: 1.)获取用户输入信息并将其存储在二进制文件中。 2.)稍后将该数据读回

我有一个多达10个结构的数组,该结构采用用户名的字符数组、用户电话号码的字符数组和浮动工资。当我输入几个测试用例时,文件写入,我的假设是正确的。当我去读取中的值时,第一个名字会像第一个电话号码一样打印出来。不管我在测试用例中输入了什么值,float都会给我-4013602080。从那里开始走下坡路。我正在尝试使用这个我的问题归结为两个部分,我是否“正确”地将结构成员写入文件,以及如何从二进制文件读取浮点值?(或者使用fopen和fclose是否有利?提示或参考将非常好

标题

//my header
#ifndef USERS_H
#define USERS_H


#include <iostream>
#include <cstring>
#include <cstdlib>
#include <limits>
#include <iomanip>

const int arsize=20;
using namespace std;
struct emp
{
    char name[arsize];
    char phone[arsize];
    float salary;
};
class Users
{
private:
    //const int arsize=20;
    int choice, num_of_names;
public:
    Users();
    void menu();
    void enter(emp*pt, int n);
    void print_all(emp*pt);
    void print_condition(emp*pt);
    void end_phone_array(emp*pt);
    void bubble_sort(emp*pt);
    void selection_sort(emp*pt);
    void raise(emp*pt);
            void file_store(emp*pt);
    void file_read(emp*pt);

};
#endif USERS_H_
//我的头
#ifndef用户
#定义用户
#包括
#包括
#包括
#包括
#包括
常数int arsize=20;
使用名称空间std;
结构emp
{
字符名[arsize];
字符电话[arsize];
浮动工资;
};
类用户
{
私人:
//常数int arsize=20;
int选项,名称的数量;
公众:
用户();
无效菜单();
无效输入(emp*pt,整数n);
全部作废打印(emp*pt);
无效打印条件(emp*pt);
无效端电话阵列(emp*pt);
无效气泡排序(emp*pt);
无效选择(emp*pt);
无效上升(emp*pt);
无效文件存储(emp*pt);
无效文件读取(emp*pt);
};
#endif用户_
以下是源文件中的必要部分,我相信:

void Users::enter(emp*pt, int n)
{
    extern int gl,count,f;
    if(gl+n>10)
    {
        cout<<"Memory Full!\n";
    }
    else
    {
        for (int i=count;i<f+n;i++)
        {
            gl++;
            cout<<"Enter user #"<<i+1<< " name(no more than 20 characters)\n";
            cin.get();
            cin.getline(pt[i].name, arsize);//.get();
            cout<<"Enter user #"<<i+1<< " phone #\n";
            cin.getline(pt[i].phone, arsize);//.get();
            cout<<"Enter user #"<<i+1<< " salary\n";
            (cin>>pt[i].salary);//.get();
        }
        count=gl;
        f=gl;
    }
}
void Users::file_store(emp* pt)
{
    //ifstream::pos_type size;
    extern int gl;
    //float test;
    //ofstream Testfile ("C:\\Users\\Ian\\Desktop\\Programming\\C++\\data.bin", ios::out| ios::binary);  //for personal computer use
    ofstream Testfile ("data.bin", ios::out | ios::binary);
    for (int i=0; i<gl;i++)
    {
        Testfile.write((char*)&pt[i].name, sizeof(pt));
        Testfile.write(pt[i].phone, sizeof(pt[i].phone));
        Testfile.write((char *)&pt[i].salary, sizeof(pt[i].salary));
    }
}
void Users::file_read(emp*pt)
{
    //extern int gl;
    struct TEST
    {
        char n_array[20];
        char p_array[13];
        float salary;
    };
    TEST test[20];
    for (int i=0;i<20;i++)
    {
        test[i].n_array[0]='\0';
        test[i].p_array[0]='\0';
        test[i].salary=0.0;
    }
    /*ifstream::pos_type size;
     * char *memblocktest;*/
    ifstream test_in ("data.bin", ios::in | ios::binary);
    for(int i=0;i<10;i++)
    {
        if(test_in.is_open())for(int i=0;i<10;i++)
        {
            test_in.read((char*)&test, sizeof(test));
            cout<<test[i].n_array<<"\n";
            cout<<test[i].p_array<<endl;
            cout<<"$"<<test[i].salary<<endl;
        }
        else
            cout<<"Don't know what I am doing!\n";
    }


}
void用户::输入(emp*pt,int n)
{
外部内部总账,计数,f;
如果(总帐+n>10)
{
cout这看起来不对:

void Users::file_store(emp* pt)
{
    // etc...

        Testfile.write((char*)&pt[i].name, sizeof(pt));
        Testfile.write(pt[i].phone, sizeof(pt[i].phone));
        Testfile.write((char *)&pt[i].salary, sizeof(pt[i].salary));
在第一行中,您存储了一个名称字段,但使用了
sizeof(pt)
作为大小,其中大小实际上是指针值的大小。您还获取名称数组的地址(a
char**
)并将其转换为
char*

要修复:

Testfile.write(pt[i].name, sizeof(pt[i].name));
Testfile.write(pt[i].phone, sizeof(pt[i].phone));
Testfile.write((char *)&pt[i].salary, sizeof(pt[i].salary));
实际上,您可能不需要单独执行这些字段(除非您试图遵守与结构不同的顺序),因为结构没有任何动态数据。您可以一次点击存储整个记录:

Testfile.write((char*)&pt[i], sizeof(struct emp));
更好的是,您可以一次命中存储整个阵列并避免循环:

Testfile.write((char*)pt, gl * sizeof(struct emp));
类似地,对于阅读…请注意,您可能也想在文件中存储
gl
的值,以便知道它包含多少条记录。或者,如果您想稍微神秘一些,您可以检查文件大小,并将
sizeof(struct emp)
分割到其中,以推断记录数。

这看起来是错误的:

void Users::file_store(emp* pt)
{
    // etc...

        Testfile.write((char*)&pt[i].name, sizeof(pt));
        Testfile.write(pt[i].phone, sizeof(pt[i].phone));
        Testfile.write((char *)&pt[i].salary, sizeof(pt[i].salary));
在第一行中,您存储了一个名称字段,但使用了
sizeof(pt)
作为大小,其中大小实际上是指针值的大小。您还获取名称数组的地址(a
char**
)并将其转换为
char*

要修复:

Testfile.write(pt[i].name, sizeof(pt[i].name));
Testfile.write(pt[i].phone, sizeof(pt[i].phone));
Testfile.write((char *)&pt[i].salary, sizeof(pt[i].salary));
实际上,您可能不需要单独执行这些字段(除非您试图遵守与结构不同的顺序),因为结构没有任何动态数据。您可以一次点击存储整个记录:

Testfile.write((char*)&pt[i], sizeof(struct emp));
更好的是,您可以一次命中存储整个阵列并避免循环:

Testfile.write((char*)pt, gl * sizeof(struct emp));

同样,对于阅读…请注意,您可能也希望在文件中存储
gl
的值,以便知道它包含多少条记录。或者,如果您希望稍微神秘一些,可以检查文件大小并划分
sizeof(struct emp)
插入其中以推断记录数。

递归地,以您指定和记录的格式(例如“原样整数,表示ASCII的长度前缀字节序列字符串”)逐个写出结构成员..并指定大于1个本机字节的数字是以大端还是小端格式写入的,并精确说明其字节大小表示:“以大端32位(4字节)值写入的整数,等等。”正确指定的任何人都应该能够获取您的bin文件,将其加载到十六进制编辑器中,并准确查看布局如何反映您的描述。如果他们不能,您可能需要更详细的详细信息。递归地,以您指定和记录的格式逐个写出结构成员(例如。“原样的整数,表示ASCII的长度前缀字节序列的字符串”)……并指定大于1个本机字节的数字是以大端还是小端格式写入的,并精确表示其字节大小:“以大端32位(4字节)值写入的整数,等等。。。“正确指定的任何人都应该能够获取您的bin文件,将其加载到十六进制编辑器中,并查看布局如何准确反映您的描述。如果他们不能,您可能需要更详细的细节。感谢帮助,我将了解我能做些什么。要在32位和64位平台之间兼容,您应该使用”#pragma pack()如果要使用单次写入()来编写结构定义,请参阅。感谢您的帮助,我将看看我能做些什么。要在32位和64位平台之间兼容,如果要使用单次写入()来编写结构定义,请在其周围使用“#pragma pack()”。请参阅