0

メモリマップトファイルからcスタイルのUnicode文字列を読み取ろうとして発生したので、charをcharごとにコピーして修正しましたが、より読みやすいIndexOutOfRangeExceptionを使用したいと思います。ReadArray

MemoryMappedFile file = MemoryMappedFile.OpenExisting("some name");
MemoryMappedViewAccessor view = file.CreateViewAccessor();
int len = (int)view.ReadUInt64(0); // Length of string + 1 is stored.
char[] buffer = new char[len];
//view.ReadArray<char>(0, buffer, sizeof(UInt64), len); // EXCEPTION
for (int i = 0; i < len; i++) // char by char, works fine.
    buffer[i] = view.ReadChar(sizeof(UInt64) + sizeof(char) * i);

使い方を示す短い例を見つけようとしましたが、見つかりReadArray<>ませんでした。

4

2 に答える 2

1

ではReadArray、最初のパラメーターで目的の位置を指定し、3 番目のパラメーターとして配列内のオフセットを指定します。

public int ReadArray<T>(
    long position,
    T[] array,
    int offset,
    int count
)

そう:

view.ReadArray<char>(0, buffer, sizeof(UInt64), len);

sizeof(UInt64)から-までのインデックスで配列を埋めるように言っていますが、sizeof(UInt64) + len - 1これは常に使用可能なインデックス値をオーバーフローさせます (sizeof(UInt64)が 0 より大きいと仮定します:-))。

試す:

view.ReadArray<char>(sizeof(UInt64), buffer, 0, len);
于 2012-10-11T12:20:45.190 に答える
0

ReadArray では、Param 1 と 3 を入れ替える必要があります。

VS 2010 の Intellisense は、ReadArray<> のパラメーターを誤って記述します。

(VS の言語/ロケールによって異なる場合があります)

于 2012-10-11T12:21:26.490 に答える