2017-02-27 48 views
2

我使用.ToArray()方法我的字符串轉換爲char數組,其大小我使char[] buffer = new char[1000000];但是當我使用以下代碼: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()'的調用。 (即把第一個結果放在一個字符串中,然後再調用字符串中的第二個)。 – 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同樣大小隻是新陣列添加到已有一個

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編碼:

完整的文件路徑由路徑參數指定。此構造函數將編碼初始化爲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

_should完成之前,您調用ToCharArray_ - 你的意思是'streamReader.ReadToEnd()'返回「未完成」字符串,直到閱讀器處置? – Fabio

+0

Dispose是一個超集。你可能會調用'streamReader.Flush()'流有這樣的壞習慣,當它們的函數返回時不能完成這個工作。只是我的經驗 – Emad

+0

這也適用於我。 –

0

您的文件是否包含二進制數據?如果它包含EOF字符,並且在文本模式下打開流(StreamReader),則該字符將表示文件結束,即使它實際上不是文件結尾。

我可以通過在文本模式下讀取隨機.exe文件來重現此問題。