我正在尝试使用C#从txt文件读取和写入。目前,我正在编写一个程序,该程序读取列表中的名称,向用户显示这些名称,请求另一个名称,然后将该名称添加到列表中。阅读很好,但写作存在一些问题。
使用CSC编译代码很好,并且执行正常,但在我输入要添加的名称并按Enter后,我会弹出一个窗口说
FileIO.exe遇到问题,需要关闭。
知道问题是什么吗?
using System;
using System.IO;
public class Hello1
{
public static void Main()
{
int lines = File.ReadAllLines("Name.txt").Length;
string[] stringArray = new string[lines + 1];
StreamReader reader = new StreamReader("Name.txt");
for(int i = 1;i <=lines;i++){
stringArray[i-1] = reader.ReadLine();
}
for (int i = 1;i <=stringArray.Length;i++){
Console.WriteLine(stringArray[i-1]);
}
Console.WriteLine("Please enter a name to add to the list.");
stringArray[lines] = Console.ReadLine();
using (System.IO.StreamWriter writer = new System.IO.StreamWriter("Name.txt", true)){
writer.WriteLine(stringArray[lines]);
}
}
}
答案 0 :(得分:2)
您收到异常是因为您没有关闭reader
,只需在将文件读取到Array后放置reader.Close();
即可。
更好的是使用using
语句,因为StreamReader
使用IDisposable
接口,这将确保关闭流以及处理它。
string[] stringArray = new string[lines + 1];
using (StreamReader reader = new StreamReader("Name.txt"))
{
for (int i = 1; i <= lines; i++)
{
stringArray[i - 1] = reader.ReadLine();
}
}
只是旁注:
你只是使用File.ReadAllLines
来获取Length
???,你可以填充你的数组:
string[] stringArray = File.ReadAllLines("Name.txt");
而不是通过StreamReader
。
答案 1 :(得分:2)
我们如何简化这一点:
foreach (var line in File.ReadLines("Name.txt"))
{
Console.WriteLine(line);
}
Console.WriteLine("Please enter a name to add to the list.");
var name = Console.ReadLine();
File.AppendLine("Name.txt", name):
现在你根本没有处理IO,因为你通过完全利用这些静态方法将它留给了框架。
答案 2 :(得分:1)
确保您了解控制台应用程序顶层的任何异常是很好的:
public class Hello1
{
public static void Main()
{
try
{
// whatever
}
catch (Exception ex)
{
Console.WriteLine("Exception!);
Console.WriteLine(ex.ToString());
}
finally
{
Console.Write("Press ENTER to exit: ");
Console.ReadLine();
}
}
}
这样,您就会知道为什么应用程序必须关闭。
此外,您需要将StreamReader
放在using
区块中。
答案 3 :(得分:0)
如果要将文件中的所有行读取到数组中,只需使用:
string[] lines = File.ReadAllLines("Name.txt");
并使用该数组。
答案 4 :(得分:-2)
使用这样的reader.ReadToEnd函数,不要忘记在完成后关闭阅读器。:
StreamReader reader = new StreamReader("Name.txt");
string content = reader.ReadToEnd();
reader.Close();
您获得该异常的原因是因为您在阅读后没有关闭阅读器。因此,如果没有先调用Close(),就无法写入;方法
你也可以使用using语句而不是像这样关闭它:
using (StreamReader reader = new StreamReader("Name.txt")){
string content = reader.ReadToEnd();
};