2017-02-27 44 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文件来重现此问题。