为什么我的c#代码不起作用?

时间:2016-08-29 01:55:41

标签: c#

我在c#中创建了一个控制台程序,就像待办任务管理器一样 但是当达到某个代码时它不起作用:

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

namespace To_Do_List
{
class Program
{
    static void Main(string[] args)
    {
        string path = @"C:\ToDoTask.txt";
        Console.WriteLine("To-do program");
        while (true)
        {
            if (Console.ReadLine() == "exit")
            {
                Environment.Exit(0);
            }

            if (Console.ReadLine() == "add")
            {
                Console.WriteLine("Please write your task and then press enter");
                string task = Console.ReadLine();
                Console.WriteLine("Task added");
                try
                {
                    StreamWriter sw = new StreamWriter(path);
                    sw.WriteLine(task);
                }
                catch
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Error: could not write task to file");
                    Console.ResetColor();
                }
            }

            if (Console.ReadLine() == "show")
            {
                try
                {
                    Console.WriteLine("Tasks:");
                    StreamReader sr = new StreamReader(path);
                    if (sr.ReadToEnd() != "")
                    {
                        Console.WriteLine(sr.ReadToEnd());
                    }
                    else
                    {
                        Console.WriteLine("No tasks left");
                    }
                }
                catch
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Error: could not read tasks file");
                    Console.ResetColor();
                }
            }

            if (Console.ReadLine() == "help")
            {
                Console.WriteLine("Write 'add' to add a new task");
                Console.WriteLine("Write 'show' to see current tasks");
                Console.WriteLine("Write 'exit' to exit program");
            }
        }
      }
    }
}

我是新编程,我找不到错误。 当我写add,show或exit时,或者没有任何帮助。 感谢。

3 个答案:

答案 0 :(得分:5)

一个问题是,您每次比较都会继续致电Console.ReadLine()。这意味着您每次都要检查用户的新输入

相反,您只需要调用Console.ReadLine()一次,将结果存储在变量中,然后将其与所有可能的匹配进行比较。此外,使用switch语句将使您的代码更简单。

while (true)
{
    var input = Console.ReadLine();

    switch (input)
    {
        case "exit":
            Environment.Exit(0);
            break;

        case "add":
            // ...
            break;

        // ...

        default:
            Console.WriteLine("Invalid input");
            break;
    }
}

答案 1 :(得分:3)

您正在while循环的每次迭代中创建一个新的StreamWriter,有效地写入文件中的任何先前数据。在循环外创建编写器并在外部关闭它。

答案 2 :(得分:0)

除了上面提到的问题之外,还需要将StreamWriters和StreamReaders放在“使用”块中。首先,因为你从不调用Flush(),Close()或Dispose(),所以你永远不会在文件中写任何东西。此外,一旦你打开StreamReader或StreamWriter一旦你有一个竞争条件,因为你无法知道什么时候文件将被关闭,所以如果你连续两次迭代调用“add”(例如),你会得到一个例外,说该文件正被另一个进程使用。

您也不想对文件位置进行硬编码或将文件放在C:\中 - 您希望将其放在特定文件夹中,而不是放在C:\驱动器的根目录中。