读写c语言二进制读写文件文件时出错,该怎么处理

71被浏览5393分享邀请回答281 条评论分享收藏感谢收起本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件。第一步:读写文件转成流对象。其实就是读写文件流 (FileStream对象,在System.IO命名空间中)。File、FileInfo、FileStream这三个类可以将打开文件,并变成文件 流。下面是引用微软对File、FileInfo、FileStream的介绍System.IO.File类 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。System.IO.FileInfo类 提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。System.IO.FileStream类 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。我直接使用&FileStream,他继承于Stream第二步:读写流。读写二进制文件用System.IO.BinaryReader和System.IO.BinaryWriter类;读写文本文件用System.IO.TextReader和System.IO.TextWriter类。下面是我的实体 (即要保持到文件的数据)&&///&&summary&&///&学生基本信息类&///&&/summary&&public&class&Student&{&&///&&summary&&&///&学号变量&&///&&/summary&&&private&String&_&&///&&summary&&&///&姓名变量&&///&&/summary&&&private&String&_&&///&&summary&&&///&语文成绩变量&&///&&/summary&&&private&Double&_score1;&&///&&summary&&&///&数学成绩变量&&///&&/summary&&&private&Double&_score2;&&///&&summary&&&///&英语成绩变量&&///&&/summary&&&private&Double&_score3;&&///&&summary&&&///&学号属性&&///&&/summary&&&public&String&Id&&{&&&get&{&return&_&}&&&set&{&_id&=&value;&}&&}&&///&&summary&&&///&姓名属性&&///&&/summary&&&public&String&Name&&{&&&get&{&return&_&}&&&set&{&_name&=&value;&}&&}&&///&&summary&&&///&语文成绩属性&&///&&/summary&&&public&Double&Score1&&{&&&get&{&return&_score1;&}&&&set&{&_score1&=&value;&}&&}&&///&&summary&&&///&数学成绩属性&&///&&/summary&&&public&Double&Score2&&{&&&get&{&return&_score2;&}&&&set&{&_score2&=&value;&}&&}&&///&&summary&&&///&英语成绩属性&&///&&/summary&&&public&Double&Score3&&{&&&get&{&return&_score3;&}&&&set&{&_score3&=&value;&}&&}&}&下面是我的读方法,读取文件中的信息到参数List&Student&&stu中&&&&///&&summary&&&///&读取信息方法&&///&&/summary&&&///&&returns&读取是否成功&/returns&&&public&void&ReadInfo(List&Student&&stu)&&{&&&Console.WriteLine("请输入文件读取路径:(键入回车为默认路径)");&&&String&filename&=&Console.ReadLine();&&&FileStream&&&&//默认路径&&&if&(filename&==&"")&&&{&&&&fs&=&new&FileStream("student.dll",&FileMode.Open);&&&}&&&else&&&{&&&&//如果文件不存在,就提示错误&&&&if&(!File.Exists(filename))&&&&{&&&&&Console.WriteLine("\n\t读取失败!\n错误原因:可能不存在此文件");&&&&&return;&&&&}&&&&//否则创建文件&&&&fs&=&new&FileStream(filename,&FileMode.Open);&&&}&&&//使用二进制读取&&&BinaryReader&br&=&new&BinaryReader(fs);&&&Console.Write("读取信息将覆盖现有的信息,继续吗?y/n&:");&&&String&command&=&Console.ReadLine();&&&if&(command&==&"y"&||&command&==&"Y")&&&{&&&&for&(int&i&=&0;&i&&&stu.C&i++)&&&&{&&&&&stu.RemoveAt(i);&&&&}&&&&//从磁盘上读取信息&&&&try&&&&{&&&&&while&(true)&&&&&{&&&&&&Student&student&=&new&Student();&&&&&&student.Id&=&br.ReadString();&&&&&&student.Name&=&br.ReadString();&&&&&&student.Score1&=&br.ReadDouble();&&&&&&student.Score2&=&br.ReadDouble();&&&&&&student.Score3&=&br.ReadDouble();&&&&&&stu.Add(student);&&&&&&student&=&null;&&&&&}&&&&}&&&&catch&(Exception)&&&&{&&&&&Console.WriteLine("\n\n读取结束!");&&&&}&&&}&&&br.Close();&&&fs.Close();&&}下面是我的写入方法,写入参数List&Student&&stu中的数据&&///&&summary&&&///&写入信息方法&&///&&/summary&&&///&&returns&写入是否成功&/returns&&&public&void&WriteInfo(List&Student&&stu)&&{&&&Console.WriteLine("请输入文件保存路径:(键入回车为默认路径)");&&&FileStream&&&&String&filename&=&Console.ReadLine();&&&//默认路径&&&if&(filename&==&"")&&&{&&&&fs&=&new&FileStream("student.dll",&FileMode.Create);&&&}&&&//手动输入路径&&&else&&&{&&&&//如果文件存在,就提示错误&&&&if&(File.Exists(filename))&&&&{&&&&&Console.WriteLine("\n\t保存失败!\n错误原因:可能存在相同文件");&&&&&return;&&&&}&&&&//否则创建文件&&&&fs&=&new&FileStream(filename,&FileMode.Create);&&&}&&&//数据保存到磁盘中&&&BinaryWriter&bw&=&new&BinaryWriter(fs);&&&foreach&(Student&student&in&stu)&&&{&&&&bw.Write((String)student.Id);&&&&bw.Write((String)student.Name);&&&&bw.Write((Double)student.Score1);&&&&bw.Write((Double)student.Score2);&&&&bw.Write((Double)student.Score3);&&&&bw.Flush();&&&}&&&bw.Close();&&&fs.Close();&&&Console.WriteLine("保存成功!");&&}
阅读(...) 评论()
友情链接:欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 9988 人关注过本帖
标题:如何读取二进制文件?
等 级:新手上路
帖 子:14
结帖率:100%
&&已结贴√
&&问题点数:20&&回复次数:28&&&
如何读取二进制文件?
#include &stdio.h&
#include &process.h&
void main()
&&& FILE *
&&& if((fp=fopen(&E:\\Encode1.da&,&rb&))==NULL)
&&&&&&&&printf(&Can't open the file! \n&);
&&&&&&&&exit(1);
&&&&&&&&c=fgetc(fp);
&&&&&&&&while (!feof(fp))
&&&&&&&&&&&&putchar(c);
&&&&&&&&&&&&c=fgetc(fp);
&&&&&&&&putchar('\n');
&&&&&&&&fclose(fp);
上面是我我写的一个利用c读取二进制文件的编程。。。但是打开来的文件是乱码。不知道原因。。。还有就是因为文件后缀是.da我之前用记事本不小心打开了。。。所以现在文件图标变成记事本格式不知道如何解除。。。求求各位大神帮忙指点一下。。。谢谢
搜索更多相关主题的帖子:
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
你知道这个文件的数据类型是什么了就这样读、写?fgetc()进来的是啥,你就敢用putchar()显示?
授人以渔,不授人以鱼。
等 级:新手上路
帖 子:14
哦~~~文件类型是1 char+1 int...原来与文件类型有关那。那应该怎么处理?谢谢啦
等 级:新手上路
帖 子:14
回复 2楼 TonyDeng
文件是1 char+1 int类型。。。这样应该怎么处理?谢谢了
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
把明白你想达到什么目的。二进制文件中储存了数值1,是整数,你fgetc()读进来也是整数1,如果你希望它保持是整数,就不用做什么,如果要显示到屏幕上让你看到,那么它必须被转化为字符串,即printf(&%d&, c)。putchar(c)是把c视为字符看待的,ASCII码1是不可见字符,当然是乱码了。
注意:ASCII码1与字符'1',是两回事,虽然人眼在屏幕上看是一样的,但那是完全不同的东西,'1'的ASCII码是49。
授人以渔,不授人以鱼。
等 级:新手上路
帖 子:14
回复 5楼 TonyDeng
有点懂了。。。文件是老师发给我们的。。。让我们打开它然后排序。所以我并不知道里面的内容。现在也就是说我需要把二进制文件转化成ASCII的形式对么?但是它是一个char 和int混合的形式该怎么办呢?
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
混合数据类型的,需要你知道它什么时候是char,什么时候是int,分开来对待。老师给这样的文件你们,那么应该配备一个对应的数据结构(struct),用这个来读。
授人以渔,不授人以鱼。
等 级:新手上路
帖 子:14
回复 7楼 TonyDeng
数据格式:
1 char + 1 int,其中char为原文字符,int为其所在位置的标示量
上面的就是老师给的数据格式。。。这个就是数据结构么?。。。混合型的又应该怎么读?分开来读么?
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
老师的原文是怎么写的呀?要么你把那个文件附件发上来看看。
授人以渔,不授人以鱼。
等 级:新手上路
帖 子:14
回复 9楼 TonyDeng
这个里面有三组数据。。。我们班是第一组
附件: 您没有浏览附件的权限,请
版权所有,并保留所有权利。
Powered by , Processed in 0.139909 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved二进制文件的读写与小结 - 难以忘记的 - 博客园
  使用DataInputStream/DataOutputStream来读写二进制文件
&  FileReader &int b=fr.read();&&读取一个字符 &
  int length=fr.read(char []);&&读取字符数组 &&
  FileWriter &fw.write(char);&&写入一个字符 &
  fw.write(char[]);&&写入字符数组 &&
& bufferedReader(字符缓冲流) &
  BufferedReader br=new BufferedReader(new FileReader("文件路径"))
  &String str=br.readerLine();读取一行字符
&& BufferedWriter(字符输出缓冲流) &
  BufferedWriter bw=new BufferedWriter(new FileWriter("文件路径")); &
  bw.write(字符串);
   &缓冲流不能单独存在 &读写字符文件 &
  &BufferedReader br=new BufferedReader(new FileReader(文件路径));&&&//读 &
  &BufferedWriter bw=new BufferedWriter(new FileWriter(文件路径,boolean));&&//写
      &读写字节文件 &
    &DataInputStream dis=new DataInputStream(new FileInputStream(文件路径));&&//读 &&
    DataOutputStream out=new DataOutputStream(new FileOutPutStream(文件路径));&&//写
&      读取整个字符
       &&String str=null; &&
      while((str=br.readLine)!=null){ &&
          &System.out.println(str); &&
          } &
      读取整个字节文件 &&
       &&
        while((b=dis.read())!=-1){
      &&&& System.out.println((char)b); &&
        &}
    示例:
        &&&DataInputStream dis=new DataInputStream(new FileInputStream("src/a.txt"));&&        &DataOutputStream out=new DataOutputStream(new FileOutputStream("src/b.txt"));          //&&&int a=dis.read();        //&&&System.out.println(a);&&      &
        //输出文件里面的内容&&&      while((b=dis.read())!=-1){&&&&      System.out.print((char)b);&      &&}
      //将a文件中的内容赋值到b文件中去&&&    while((b=dis.read())!=-1){&&&    &out.write(b);&&      &}
     //关闭流&    &&dis.close();&&    &out.close();
阅读(...) 评论()安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&

我要回帖

更多关于 java 二进制文件读写 的文章

 

随机推荐