0

私は外部マージソートとそれがどのように機能するかを知っています。しかし、現在、私はそれを実装している間立ち往生しています。配列を並べ替えてマージするコードを記述しましたが、ファイルとの間でデータを読み書きするときに問題が発生します。C++で次のメソッドを実装したいと思います。

1. int * read(int s, int e) : This method should read from file all the number 
starting from 's' till 'e' and return the array
2. write(int a[], int s, int e) : This method should write to file the input 
array by replacing the numbers from s to e.

たとえば。

Given file has the following numbers:

1
2
3
4
5
6

read(0, 2) should return [1,2,3]
write([4,5,6], 0, 2) should update the file to :
4
5
6
4
5
6

これらの両方のメソッドを実装するにはどうすればよいですか?

4

2 に答える 2

1

最初にすべきことは、生のポインターの操作を停止することです。

std::vector<int>同様に効率的で、バグが発生しにくくなります。

次に、ファイル形式が重要です。32ビットの符号付き整数がパックされたバイナリファイルを想定します。

読み取りと書き込みの署名は次のようになります。

std::vector<int> read( std::ifstream const& f, int offset );
void write( std::ofstream& f, int offset, std::vector<int> const& data );

ifstreamofstreamシークメソッドがあります-特に、ifstream持っているseekgofstream持っていseekpます。

ifstream.read( char* , length )現在の取得位置(によって設定され、によって進められる)lengthでファイルからバイトを読み取ります。ファイルのメモリレイアウトに関心がない場合は、から取得し、それをに再解釈して、バッファの読み取りに一度に進むことができます。seekgread.data()std::vector<int>char*read( reinterpret_cast<char*>(vec.data()), sizeof(int)*vec.size() )

ofstreamほぼ同じように機能する同様のwrite方法があります。

データをディスクに生で書き込んだり戻したりするのは危険ですが、ほとんどの(すべての?)実装では、同じ実行セッション(およびおそらくセッション間)でデータを書き込んだり読み取ったりしても安全です。データがセッション間で存続することを意図している場合、またはデータがコードから出力/入力される場合は、さらに注意してください。

于 2013-02-27T20:25:24.283 に答える
0

ファイルの行にジャンプするC++標準関数はありません。したがって、ファイルを1行ずつ読み取る必要があります(たとえば、getlineを使用します。http: //www.cplusplus.com/reference/string/string/getline/ )。

私が覚えている限り、外部マージソート(古いものは、いくつかのテープドライブを備えたコンピューター用に設計されています)を別々のファイルで使用する場合、あなたのようなインターフェイスは必要ありません-順番に作業できます。

于 2013-02-27T20:23:31.067 に答える