将文本文件读入字符串数组-为什么我得到意外的输出?

时间:2019-02-14 15:07:56

标签: c# arrays text-files

试图创建一个简单的Hangman游戏,从而读取外部文本(称为words.txt)并将其中的字符串导入到称为WordsArray的字符串数组中。

程序可以正常编译,但是,它要求我两次输入文件名,然后才能显示填充数组的内容(请参见下面的foreach循环)

有人可以确定为什么在显示之前要求我两次输入文件名吗?

(而且,更普遍地说,我的重构是否适合此简单应用程序?)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static string [] LoadWords()
        { 
            bool repeat = true;
            while (repeat)
            {
                Console.WriteLine("Please enter the name of a file:");
                string filename = Console.ReadLine();

                try
                {
                    string[] WordsArray = File.ReadAllLines(filename);
                    if (WordsArray.Length == 0)
                        return null;
                    else
                        return WordsArray;
                }
                catch (FileNotFoundException msg)
                {
                    Console.WriteLine("\n Check the file exists!");
                }
            }
            return null;
        }

        static void DisplayWordsArray(string [] WordsArray)
        {
            foreach (string word in WordsArray)
                Console.WriteLine(word);
        }
        static void Main(string[] args)
        {
            string[] WordsArray= new string[10];
            if (LoadWords() != null)
            {
                Console.WriteLine("File Loaded...\n\n");
                WordsArray = LoadWords();
                DisplayWordsArray(WordsArray);
            }
            Console.ReadLine();
        }
    }
}

3 个答案:

答案 0 :(得分:7)

这是因为您两次调用LoadWords()。

您应该写:

string[] WordsArray= LoadWords();
if (WordsArray != null)
{
  Console.WriteLine("File Loaded...\n\n");
  DisplayWordsArray(WordsArray);
  ...

答案 1 :(得分:0)

正如一些评论和Jesper的回答所提到的,重复性是由于两次调用函数LoadWords()。这是导致错误的常见原因,并且往往是由于需要编写尽可能少的代码行(直接使用函数来消除变量声明和初始化)。

此外,在可以以其他方式处理错误时故意触发异常并非明智之举。请参见docs中的以下代码段:

  

对于可能发生但可能触发异常的条件,请考虑以避免异常的方式进行处理。

由于存在方法File.Exists()用于检查文件的存在,因此使用它而不是预期异常是适当的。

START_EDIT:,因为文件可以被外部进程删除,锁定或以其他方式更改,因此,如@RufusL所述,请谨慎使用try...catch块(另请参阅Eric Lippert的帖子{{3 }})。 Mea culpa! END_EDIT

最后,您的重构很好:让方法处理一件事情并妥善处理几乎总是最好的。

答案 2 :(得分:0)

将逻辑更改为仅回答一次问题,并处理已知的丢失文件的可能性。如果发生异常,请退出:

static string[] LoadWords()
{
    string[] WordsArray = null; 
    Console.WriteLine("Please enter the name of a file:");

    do
    {
        try
        {  
            string filename = Console.ReadLine();

            if (File.Exists(filename))
                WordsArray = File.ReadAllLines(filename);
            else
                Console.WriteLine($"{Environment.NewLine} File does not exist, try again: ");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"{Environment.NewLine} Unknown exception, exiting. {ex.Message}");
            return null;
        }
    }
     while (WordsArray == null)

    return WordsArray;
}