从二进制文件读取内容并在ListBox中显示的格式问题求助
解决ListBox中二进制读取内容并排显示的问题
嘿,我懂你遇到的这个小麻烦!ListBox里数据挤在一行,肯定是读取的时候没把每条数据单独添加成ListBox的项,而是一股脑拼成了一个长字符串塞进去了。咱们一步步来解决:
首先,先确认你的写入逻辑是对的——用BinaryWriter写入数据时,每条数据要单独调用Write()方法(比如写字符串用Write(string),写数值用Write(int)),这样每条数据在二进制文件里是独立的单元。
然后重点看读取逻辑,这是你问题的核心:不要把所有读取到的内容拼接成一个字符串再添加,要读一条就往ListBox里加一条。
给你举个完整的示例:
写入二进制文件的代码(比如button1_Click)
private void button1_Click(object sender, EventArgs e) { // 用using自动释放文件资源,避免占用 using (BinaryWriter bw = new BinaryWriter(File.Open("testData.bin", FileMode.Create))) { // 逐条写入测试数据,字符串和数值都可以 bw.Write("用户ID: 001"); bw.Write("用户名: Adi"); bw.Write("积分: 1500"); bw.Write(2024); // 写入一个整数 } }
读取并显示到ListBox的代码(比如button2_Click)
private void button2_Click(object sender, EventArgs e) { listBox1.Items.Clear(); // 先清空ListBox原有内容 using (BinaryReader br = new BinaryReader(File.Open("testData.bin", FileMode.Open))) { // 循环读取直到文件末尾 while (br.BaseStream.Position != br.BaseStream.Length) { // 注意:读取的类型必须和写入的类型严格对应! // 这里前三条是字符串,最后一条是int,所以要分情况读(或者统一写入字符串) if (br.BaseStream.Position < br.BaseStream.Length - sizeof(int)) { string dataStr = br.ReadString(); listBox1.Items.Add(dataStr); // 每条数据单独加,自动换行 } else { int dataInt = br.ReadInt32(); listBox1.Items.Add($"年份: {dataInt}"); // 转成字符串再添加 } } } }
关键要点提醒:
- 类型匹配:写入时用
Write(string),读取就必须用ReadString();写入int就用ReadInt32(),类型不匹配会直接抛出异常。 - 逐条添加:每次读取一条数据就调用
listBox1.Items.Add(),这样ListBox会把每个Add的内容当成单独的一行显示。 - 避免拼接:如果像下面这样写,肯定会并排显示,这是错误的写法:
// ❌错误示例:拼接成大字符串再添加,导致所有内容在一行 string allContent = ""; while (br.BaseStream.Position != br.BaseStream.Length) { allContent += br.ReadString(); } listBox1.Items.Add(allContent);
如果你的数据是自定义对象,那需要先序列化对象再写入,读取时反序列化后逐个添加到ListBox就行。
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

