-2

読み取り関数には、ファイルへのnバイト(2番目の引数で言及)を格納するための配列へのポインターとしての最初の引数があります。

クエリは、

クラスxの2つのオブジェクトを作成した場合。

それから、

x stack[2]; 

2つのオブジェクトの内容を入力し、ファイル'xyz'を開いたと仮定します(fstreamを使用して、オブジェクトファイルを作成し、コマンドfile.open("xyz",ios::in|ios::out)を使用して、書き込みを使用して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 に答える