读取文本文件并将某些行分配给某些变量

本文关键字:分配 变量 取文本 读取 文件 | 更新日期: 2023-09-27 17:59:57

我正在开发一款Trivia C#控制台游戏,该游戏读取一个文本文件,该文件包含一个问题、多个选项、正确选项的编号和答案解释。共有四个问题集。任务是将文件中的每个问题提示到控制台窗口,让用户输入答案,然后将用户的答案与正确答案进行比较。文件中的所有四个问题都应该这样做。

创建了一个包含question、multipleAnswewrChoice、correctAnswer和answerExplaition的类,每个字段都有getter和setter。

我正在努力解决的问题是,在阅读文件后,如何将每个问题分配给某个变量,以便提示用户,并对四组进行提示。我制作了一个大小为4的数组(因为每个问题集有4行)来存储行,然后将每个元素分配给上面的每个变量,但我不知道如何循环来对所有四个集合执行相同的操作。

QuestionUnit是包含问题字段的类。

 public void ReadQuestionFile( QuestionUnit unit)
        {
            string[] arrayReader = new string[4];
            string line = "";
            int i = 0;
            string fileName = "TextFile1.txt";
            StreamReader myReader = new StreamReader(fileName);
            while ((line = myReader.ReadLine()) != null && i < 4 )
            {
                arrayReader[i] = line;
                // Console.WriteLine(line);
                //Console.WriteLine(arrayReader[i]);
                i++;
            }
           unit.M_Question  = arrayReader[0];
            unit.M_Answers = arrayReader[1];
            unit.M_CorrectAnswers = arrayReader[2];
            unit.M_Explanation = arrayReader[3];

        }

有什么办法吗?

读取文本文件并将某些行分配给某些变量

因为所有数据都在同一个文件中,所以需要采取稍微不同的方法。我将使用返回阅读问题列表的功能,而不是传递要填写的项目:

public IEnumerable<QuestionUnit> ReadQuestionFile()

然后,循环读取,直到到达文件的末尾。这种方法对于无效输入是不安全的,所以要小心:

string fileName = "TextFile1.txt";
List<QuestionUnit> readQuestions = new List<QuestionUnit>();
using (StreamReader myReader = new StreamReader(fileName))
{
    while (!myReader.EndOfStream)
    {
        QuestionUnit newQuestion = new QuestionUnit();
        newQuestion.M_Question  = myReader.ReadLine();
        newQuestion.M_Answers = myReader.ReadLine();
        newQuestion.M_CorrectAnswers = myReader.ReadLine();
        newQuestion.M_Explanation = myReader.ReadLine();
        readQuestions.Add(newQuestion);
    }
}
return readQuestions;

基本上,你一直读到文件的末尾,一次读四行。如果输入格式不正确,您将得到一些null值。这里实际上不需要数组,因为您可以将值直接存储在对象中,然后在填充完后将其添加到列表中(从技术上讲,您以前也可以这样做)。然后你将填写好的列表返回给任何使用它的人。

您可以使用yield return,而不是直接添加到列表中,但这是一个有点高级的入门概念,我不确定它与文件I/O的配合效果如何。无论哪种方式,意识到它的存在都是好的。唯一的变化将是删除readQuestions,并且行:

yield return newQuestion;

当前对CCD_ 3的呼叫所在的位置。

如果我能澄清什么,请告诉我!