我在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时,或者没有任何帮助。 感谢。
答案 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:\驱动器的根目录中。