国际.TryParse 在 StreamReader 的第一行数据上返回 false
本文关键字:一行 数据 false 返回 TryParse StreamReader 国际 | 更新日期: 2023-09-27 18:33:08
长期阅读,第一次海报。
我只是使用 StreamReader
类将数字从文本文件读取到整数数组中,每行一个整数。我通读了一次文件以获取行数,以便我可以正确定义目标数组。然后,我将指针重置为文本文件的开头并再次读取,这次使用int.TryParse
将字符串隐藏为整数并写入数组。但是文件中的第一行从 TryParse 返回 'false' - 即使字符串只是 '3。后续行返回"true"就好了。这是片段...
_NumbersInMemory = new int[lineCount];
theFileStream.DiscardBufferedData();
theFileStream.BaseStream.Seek(0, 0);
lineCount = 0;
do
{
string theLineFromTheFle = theFileStream.ReadLine();
int numberInMemoryTemporarily = 0;
bool result = int.TryParse(theLineFromTheFle, out numberInMemoryTemporarily);
if (result)
{
_NumbersInMemory[lineCount] = numberInMemoryTemporarily;
}
lineCount++;
} while (!theFileStream.EndOfStream);
theStream.Close();
重置到文件开头(只有 82 行)是否弄乱了 TryPars 第一次迭代的输入,或者类似的东西?
我会考虑改用这段代码:
_NumbersInMemory =
File
.ReadAllLines(@"path")
.Select(line => line.Trim())
.Select(line =>
{
int numberInMemoryTemporarily = 0;
if (int.TryParse(line, out numberInMemoryTemporarily))
{
return numberInMemoryTemporarily;
}
return 0;
})
.ToArray();
.Select(line => line.Trim())
可能足以摆脱您遇到的问题。
您的文件开头可能有 UTF8 或 Unicode 字节顺序标记 (BOM)。在十六进制查看器中查看文件可以验证这一点。
首次打开文件时,StreamReader
类将读取这些字节以确定文件其余部分的正确编码。第一个ReadLine()
将不包括这些字节。
通过查找基础流的字节 0,下一个ReadLine()
将包含这些字节,因为StreamReader
不知道它应该跳过它们(它已经读取并处理了它们)。
使用 ReadAllLines
读取文件一次,或者关闭并重新打开文件以再次开始读取,而不是返回到开头。