将StreamReader设置为开始时出现奇怪的问号

时间:2019-02-13 12:15:15

标签: c# streamreader

我正在编写有关求职面试的程序。除了一件事,一切都正常工作。当我使用外部方法TotalLines(我有单独的StreamReader)时,它正常工作,但是当我在程序中计算许多totalLines时,在第一个问题的开头收到一个问号。就是这样:

?您叫什么名字?

但是在我正在阅读的文本文件中,我只有-你叫什么名字?

我不知道为什么会这样。我将StreamReader重新开始可能是问题吗?我检查了我的编码,所有内容,但没有任何效果。感谢您的帮助:)

PotentialEmployee potentialEmployee = new PotentialEmployee();
using (StreamReader InterviewQuestions = new StreamReader(text, Encoding.Unicode))
{
    int totalLines = 0;
    while (InterviewQuestions.ReadLine() != null)
    {
        totalLines++;
    }
    InterviewQuestions.DiscardBufferedData();
    InterviewQuestions.BaseStream.Seek(0, SeekOrigin.Begin);

    for (int numberOfQuestions = 0; numberOfQuestions < totalLines; numberOfQuestions++)
    {
        string question = InterviewQuestions.ReadLine();
        Console.WriteLine(question);
        string response = Console.ReadLine();
        potentialEmployee.Responses.Add(question, response);
    }
}

但是当我在外部方法中进行TotalLines计算时,问号不会显示。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

很有可能文件以byte order mark (BOM)开头,最初被读者忽略,但随后在“倒带”流时不会被忽略。

虽然您可以创建一个新的阅读器,或者甚至在阅读后将其替换,但我认为最好避免两次阅读该文件以开始:

foreach (var question in File.ReadLines(text, Encoding.Unicode))
{
    Console.WriteLine(question);
    string response = Console.ReadLine();
    potentialEmployee.Responses.Add(question, response);
}

那是更短,更简单,更有效的代码,也不会显示您所问的问题。

如果您想确保在问任何问题之前可以阅读整个文件,那也很容易:

string[] questions = File.ReadAllLines(text, Encoding.Unicode);
foreach (var question in questions)
{
    Console.WriteLine(question);
    string response = Console.ReadLine();
    potentialEmployee.Responses.Add(question, response);
}

答案 1 :(得分:2)

每当从头开始查找流时,就不会再次读取字节顺序标记(BOM),只有在创建了指定了Encoding的流读取器后,才第一次读取它。

为了再次正确读取BOM表,您需要创建一个新的流读取器。但是,如果您指示流读取器在处置读取器后使其保持打开状态,则可以重用该流,但是请务必在创建新读取器之前进行搜索。