国际.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 第一次迭代的输入,或者类似的东西?

国际.TryParse 在 StreamReader 的第一行数据上返回 false

我会考虑改用这段代码:

_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 读取文件一次,或者关闭并重新打开文件以再次开始读取,而不是返回到开头。