2017-02-27 11 views
2

私はそのサイズが、私はchar[] buffer = new char[1000000];を保持しているが、私は次のコードを使用していたときにchar配列に私の文字列を変換する.ToArray()メソッドを使用しています:てToArray()関数の制限

using (StreamReader streamReader = new StreamReader(path1)) 
{ 
    buffer = streamReader.ReadToEnd().ToCharArray(); 
} 
// buffer = result.ToArray(); 
threadfunc(data_path1); 

は、バッファのサイズが固定取得最大8190まで、.ToCharArray()または.ToArray()を使用した後もファイル全体を読み取っていません。 .ToCharArray()または.ToArray()にサイズの制限がある理由は何ですか?この関数を使用しない場合、私は文字列形式でファイル全体を読むことができますが、この関数を使用してchar配列に変換しようとすると、サイズの制限があります。

+2

'ReadToEnd()'と 'ToCharArray()'の呼び出しを分けてみますか? (すなわち、最初の文字列を文字列に入れて、文字列の2番目の文字列を呼び出します。) – Emad

+0

ToCharacterArrayを使って文字を取得する方法は、サイズが指定されていない配列 'buffer'を宣言できます。読み取り時に正しいサイズにサイズが調整されます。言い換えれば、 'char [] buffer;'は動作します。 – JohnG

+0

[ToCharArray()](https://referencesource.microsoft.com/#mscorlib/system/string.cs,81c2d980f5d0ee35,references)は、文字列全体をバイト配列に変換します。生成される配列のサイズに制限はありません。 – Serge

答えて

1

ToCharArray()は、配列の新しいインスタンスを返します。したがって、bufferは、ReadToEndによって返されるデータのサイズである新しいインスタンスを参照します。

あなたはbuffer同じサイズを維持したい場合は、あなただけの結果の配列を使用したい場合は、単に存在していた1

char[] buffer = new char[1000000]; 
using (StreamReader streamReader = new StreamReader(path1)) 
{ 
    var tempArray = streamReader.ReadToEnd().ToCharArray(); 
    tempArray.CopyTo(buffer, 0); 
} 

に新しい配列を追加する - あなたは、配列のサイズを「予測」する必要はありません - ちょうど返されたものを使用してください

public char[] GetArrayFromFile(string pathToFile) 
{ 
    using (StreamReader streamReader = new StreamReader(path1)) 
    { 
     var data = streamReader.ReadToEnd(); 
    } 
    return data.ToCharArray(); 
}  

var arrayFromFile = GetArrayFromFile(@"..\path.file"); 
+0

私のために働いた.... –

0

誤ったエンコードを使用している可能性があります。 StreamReader(String)は、UTF8エンコーディングを使用します。

完全なファイルパスは、pathパラメータで指定します。この コンストラクタは、エンコーディングをUTF8Encodingに、バッファ を1024バイトに初期化します。

特に必要がない限り、バッファサイズを事前に割り当てないでください。

ファイルがASCII形式である場合、あなたはあなたのStreamReaderコンストラクタ更新する必要があります。

char[] buffer = null; 

using (StreamReader streamReader = new StreamReader(path1, Encoding.ASCII)) 
{ 
    buffer = streamReader.ReadToEnd().ToCharArray(); 
} 
// buffer = result.ToArray(); 
threadfunc(data_path1); 
2

私の推測では、問題はあなたがToCharArray()を呼び出す前に、最後までその読み取りが終了するはずですが。これはあなたを助けるかもしれません。 ToCharArray()は、char[]という新しいインスタンスを作成するので、バッファを定義する必要はありません。

string content; 
using (StreamReader streamReader = new StreamReader(path1)) 
{ 
    content = streamReader.ReadToEnd(); 
} 
var buffer = content.ToCharArray(); 
+0

ToCharArray_を呼び出す前に完了していなければなりません - あなたは 'streamReader.ReadToEnd()'がリーダーが破棄されるまで "not finished"の文字列を返しますか? – Fabio

+0

廃棄はスーパーセットです。あなたは 'streamReader.Flush()'を呼び出すかもしれません。ストリームは、関数が返ってきたときにジョブを終了しないというこの悪い習慣を持っています。ちょうど私の経験 – Emad

+0

これも私のために働いた。 –

0

ファイルにバイナリデータが含まれていますか? EOF文字が含まれていてストリームがテキストモードで開かれている場合(StreamReader)、その文字は実際にファイルの最後ではない場合でも、ファイルの終わりを示します。

ランダムな.exeファイルをテキストモードで読むことでこれを再現できます。

関連する問題