读入二进制文件时发生错误????

东dong哥 2012-05-10 10:01:09
部分代码:

public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
char[] car = br.ReadChars((int)fs.Length);
string[] scar = OutPutArray(car);
lb.Items.AddRange(scar);//把文件读入到ListBox里面
br.Close();
}
}
public string[] OutPutArray(char[] car)
{
string[] ss = {};//这行错误吗? 有位同学将其赋值为null没事,而我会报“没有new”的错误
//string ss2 = "";
int k = 0;
for (int i = 0; i <= car.Length; i++)
{
//MessageBox.Show(car.Length.ToString());
while (car[i] != ',' && i != car.Length)
{
ss[k] += car[i];//这行代码出现“索引超出了数组界限”,想不明白
i++;
}
//ss[k] = ss2;
k++;
//ss2 = "";
//i++;
}
return ss;
}


问题都在代码里面注释了,如果您有时间,如果您愿意,麻烦帮忙看看,谢谢啦^_^
...全文
181 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
东dong哥 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C# code
public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
……
[/Quote]
我用您的代码测试了一下,会报错“无法在流的结尾之外进行读取。” 8楼的没问题…
xky96 2012-05-10
  • 打赏
  • 举报
回复
如果他文件中还有整数之类的二进制数据,
br.ReadString()就读不全。
但看这样子文件内容都是从listBox中获取的,如果没有特殊处理,
应该都是unicode。
该没问题吧
potterguo 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

你想出来的splite给俺抄袭了,请你见谅了
对了你的br.ReadString()只能读取一个字节,他要的是文件的全部内容,这个用BinaryReader 怎么解决,我感觉操作不方便就用StreamReader 来读取文件的了。
[/Quote]
汗,别字太多修改一下。
potterguo 2012-05-10
  • 打赏
  • 举报
回复
你想出来的splite给俺偷袭了,哈哈。
对了你的br.ReadString()智能读取一个字节,他要的是文件的全部内容,这个用BinaryReader 怎么解决,我感觉操作不方便就用StreamReader 来读取文件的了。
xky96 2012-05-10
  • 打赏
  • 举报
回复
咦?8楼捷足先登了?
不地道啊~~~~~~~~~~
xky96 2012-05-10
  • 打赏
  • 举报
回复
public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
string[] scar = br.ReadString().Split(new char[] { ',' });
lb.Items.AddRange(scar);//把文件读入到ListBox里面
br.Close();
}
}
potterguo 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

看不明白OutPutArray的作用,其中错误也有多处。
如果是想根据逗号','分拆单词,
可以用string.split方法


思路是这样子的:把每个ListBox的项变成二进制写进二进制文件,考虑到要读出来方便,所以用“,”作为分隔标记;读出来的时候,读到“,”,就表示读到一个项(item),然后可以add进ListBox里面。
[/Quote]

按你的说法,不用那么多,可以这样写:

public void bReadFile(string file, ListBox lb)
{
using (StreamReader streamReader = new StreamReader(file))
{
string content = streamReader.ReadToEnd();
string[] items = content.Split(',');
lb.Items.AddRange(items);
streamReader.Close();
}
}
potterguo 2012-05-10
  • 打赏
  • 举报
回复
改的地方太多了,不一个个说了,我把测试通过的给你看,你自己一一对比吧。

public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
char[] car = br.ReadChars((int)fs.Length);
string[] scar = OutPutArray(car);
lb.Items.AddRange(scar);
br.Close();
}
}
public string[] OutPutArray(char[] car)
{
int len = 0; //存储要分配的字符数组的个数
for (int i = 0; i < car.Length; i++)
{
if (car[i] != ',')
{
len++;
}
}

int k = 0;
string[] ss=new string[len]; //必须要new了才能分配内存空间
for (int i = 0; i < car.Length; i++)
{ //这个里面不要套while了,外面那层for已经是循环了
if (car[i] != ',') //&& i != car.Length这个也已经通过 for里面的i < car.Length实现了。
{
ss[k] += car[i];
k++;
}
}
return ss;
}
  • 打赏
  • 举报
回复
+1
[Quote=引用 5 楼 的回复:]

试试:
for (int i = 0; i < car.Length; i++)
{
//MessageBox.Show(car.Length.ToString());
while (car[i] != ',' && i != car.Length-1)
……
[/Quote]
mabaolin 2012-05-10
  • 打赏
  • 举报
回复
试试:
for (int i = 0; i < car.Length; i++)
{
//MessageBox.Show(car.Length.ToString());
while (car[i] != ',' && i != car.Length-1)
{
ss[k] += car[i];//这行代码出现“索引超出了数组界限”,想不明白
i++;
}
//ss[k] = ss2;
k++;
//ss2 = "";
//i++;
}
东dong哥 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

看不明白OutPutArray的作用,其中错误也有多处。
如果是想根据逗号','分拆单词,
可以用string.split方法
[/Quote]

思路是这样子的:把每个ListBox的项变成二进制写进二进制文件,考虑到要读出来方便,所以用“,”作为分隔标记;读出来的时候,读到“,”,就表示读到一个项(item),然后可以add进ListBox里面。
xky96 2012-05-10
  • 打赏
  • 举报
回复
看不明白OutPutArray的作用,其中错误也有多处。
如果是想根据逗号','分拆单词,
可以用string.split方法
东dong哥 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

for (int i = 0; i <= car.Length; i++)
改为
for (int i = 0; i < car.Length; i++)

记住下标从0开始
[/Quote]
没用,我一开始就是没等号的
bdmh 2012-05-10
  • 打赏
  • 举报
回复
for (int i = 0; i <= car.Length; i++)
改为
for (int i = 0; i < car.Length; i++)

记住下标从0开始
东dong哥 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

改的地方太多了,不一个个说了,我把测试通过的给你看,你自己一一对比吧。
C# code

public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryRe……
[/Quote]
刚才好像没引用回复成功。再发一次:
我也测试了,您修改后的代码可以成功读取,就是逐个字母显示,所以我改了:

public string[] OutPutArray(char[] car)
{
int len = 0; //存储要分配的字符数组的个数
for (int i = 0; i < car.Length; i++)
{
if (car[i] == ',')
{
len++;
}
}

int k = 0;
string[] ss=new string[len]; //必须要new了才能分配内存空间
for (int i = 0; i < car.Length; i++)
{
if (car[i] != ',') //&& i != car.Length这个也已经通过 for里面的i < car.Length实现了。
{
ss[k] += car[i];
//k++;
}
else k++;
}
return ss;
}
东dong哥 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

改的地方太多了,不一个个说了,我把测试通过的给你看,你自己一一对比吧。
C# code

public void bReadFile(string file, ListBox lb)
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
BinaryRe……
[/Quote]

这些代码我也调试了,发现输出来的是单个字符,然后我就改了一下:

public string[] OutPutArray(char[] car)
{

int len = 0; //存储要分配的字符数组的个数
for (int i = 0; i < car.Length; i++)
{
if (car[i] == ',')
{
len++;
}
}

int k = 0;
string[] ss = new string[len]; //必须要new了才能分配内存空间
for (int i = 0; i < car.Length; i++)
{ //这个里面不要套while了,外面那层for已经是循环了
if (car[i] != ',') //&& i != car.Length这个也已经通过 for里面的i < car.Length实现了。
{
ss[k] += car[i].ToString();//这里没用ToString有一次会报错,后来又没报了
//k++;
}
else k++;
}
return ss;

}

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧