-2

read 函数的第一个参数是指向一个数组的指针,用于在文件中存储 n 个字节(第二个参数提到的)......

查询是,

如果我创建了 2 个 x 类的对象..

然后,

x stack[2]; 

假设我已经填充了 2 个对象的内容,打开了一个文件“xyz”(使用 fstream,我创建了对象文件并使用了命令file.open("xyz",ios::in|ios::out)并使用 write 用 2 个对象的内容填充了文件。

现在如果我使用这个命令

file.read((char*) &stack[1],sizeof(stack[0]))

会有, stack[1]_stack[0]

即读取函数会将其第一个参数地址作为&stack[1]还是会考虑&stack[0]

更新:用于反转堆栈内容的代码

// //反转对象的内容

    #include "stdafx.h"
    #include<iostream>
    #include<fstream>
    #include<iomanip>

    using namespace std;

    class Inventory
    {
     char name[10];
     int code;
     int cost;

     public:

     void readdata();
     void writedata();
    };

    void Inventory::readdata(void)
    {
     cin>>name;
     cin>>code;
     cin>>cost;
    }

    void Inventory::writedata(void)
    {
     cout<<setiosflags(ios::left)
     <<setw(10)<<name
     <<resetiosflags(ios::right)
     <<setw(10)<<code
     <<setprecision(2)
     <<setw(10)<<cost
     <<endl;
    }

    int main()
    {
     Inventory item[3];

     fstream file;

     file.open("Stock",ios::in|ios::out);

     cout<<"Enter details for three items\n";

     for(int i=0;i<3;i++)
     {
       item[i].readdata();
       file.write((char*) &item[i],sizeof(item[i]));
     }
     file.seekg(0);

     cout<<"\nOutput\n\n";

     for(int i=0;i<3;i++)
     {
         file.read((char*) &item[2-i],sizeof(item[i]));
     }

     for(int i=0;i<3;i++)item[i].writedata();
     file.close();
     return 0;

    }
4

3 回答 3

1

假设您已经倒带或重新打开了文件,并且您已正确写出数据,并且x可以轻松复制(这意味着 的析构函数x没有副作用),那么是的:您已经编写了一种复杂的复制方式stack[0]进入stack[1].


更新:无需完成所有代码,这应该可以工作

#include <type_traits>
#include <fstream>

int main()
{
    char const * filename = "myfile.bin";

    Foo stack[2] = { /* ... initialize ... */ };

    static_assert(std::is_trivially_copyable<Foo>::value,
                  "Error: Foo cannot be serialized naively.");

    {
        std::ofstream ofile(filename, std::ios::binary);
        ofile.write(reinterpret_cast<char const *>(stack), sizeof stack);
    }

    {
        std::ifstream ifile(filename, std::ios::binary);
        ifile.read(reinterpret_cast<char *>(stack + 1), sizeof(stack[0]));
    }

    assert(stack[0] == stack[1]);  // if operator==() is implemented
}
于 2012-09-03T15:57:04.790 回答
0

您的代码不会stack[0]在任何地方的评估上下文中使用;sizeof是一个未评估的上下文。所以没有理由read使用stack[0].

于 2012-09-03T15:55:22.887 回答
0

尝试这个:

file.open("Stock",ios::in|ios::trunc|ios::out);
于 2012-09-03T22:15:47.770 回答