C#将随机排序的用户输入姓名数组写入文件时数据保存异常求助
问题成因
- 随机排序、写入文件的逻辑错误嵌套在输入姓名的for循环内:每输入1个姓名就打乱一次整个数组,此时数组中还未完成输入的位置均为null值,且每次写入都会直接覆盖整个文件,最终写入的内容会包含大量空值、顺序也完全不符合预期。
- 调用了异步方法
File.WriteAllLinesAsync但没有添加await等待执行完成:主线程会继续向下执行,IO操作可能还没完成就被中断,导致文件内容写入不完整甚至完全为空。 - 读文件逻辑在程序启动时就执行:如果用户先执行写入操作再执行读取操作,读取的仍然是程序启动时加载的旧文件内容,无法拿到最新写入的结果。
修复方案
调整逻辑顺序:先完成所有姓名输入,再做随机排序,最后一次性写入文件;读取文件操作移到read分支触发时再执行,优先使用同步写入方法避免异步等待问题,修复后代码如下:
using System; using System.Linq; using System.IO; namespace test { class Program { static void Main(string[] args) { Random rnd = new Random(); // 统一文件路径避免两处写路径不一致 string filePath = @"C:\Users\dvfsn\Desktop\Coding\cSharp testing\studentnames.txt"; Console.WriteLine("你想要读取还是写入数据?"); switch(Console.ReadLine()){ case "write": string[] names = new string[10]; // 先完成所有姓名输入 for (int i = 0; i < names.Length; i++) { Console.WriteLine("输入第{0}个姓名", i); names[i] = Console.ReadLine(); } // 全部输入完成后再做随机排序 names = names.OrderBy(x => rnd.Next()).ToArray(); // 用同步方法一次性写入文件,避免异步未完成问题 File.WriteAllLines(filePath, names); Console.WriteLine("写入完成"); break; case "read": Console.WriteLine("你想要读取什么数据?"); switch(Console.ReadLine()){ case "names": // 触发读取时再加载最新的文件内容 string[] lines = File.ReadAllLines(filePath); Console.WriteLine("内容如下:"); foreach (string line in lines){ Console.WriteLine("\t" + line); } break; } break; } Console.ReadLine(); } } }
补充说明
- 如果需要保留异步写入逻辑,需要将Main方法改为异步签名
static async Task Main(string[] args),写入时添加await关键字:await File.WriteAllLinesAsync(filePath, names)即可正常执行。 - 如果不需要固定输入10个姓名,可以改用
List<string>动态存储输入内容,避免未填充满数组产生的空值问题。
内容的提问来源于stack exchange,提问作者dvfsn
相关产品推荐
相关产品推荐

