CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

请教往文件中写数据或读出时出现一些莫名其妙的字符时怎么解决??!

楼主jsjwql(wql)2003-12-02 17:58:56 在 C/C++ / C语言 提问

请教往文件中写数据或读出时出现一些莫名其妙的字符时怎么解决??! 问题点数:30、回复次数:17Top

1 楼fierygnu(va_list)回复于 2003-12-02 18:15:11 得分 0

贴代码。Top

2 楼antijpn(antijpn)回复于 2003-12-02 18:19:49 得分 20

你打开的可能不是文本文件,所以会有那些莫名其妙的字符,或者可能是包含汉字的文件,需要用wchar来保存,也有可能根本就不是文本,所以只能使用二进制打开和读取Top

3 楼jsjwql(wql)回复于 2003-12-02 18:28:43 得分 0

#include"stdio.h"  
  #include"malloc.h"  
  #define   LENGTH   sizeof(struct   node)  
  struct   node  
  {  
    char   name[10];  
    char   adr[20];  
    char   tel[13];  
    char   email[20];  
    struct   node   *next;  
  };  
   
  typedef   struct   node   NODE;  
  int   N;  
   
   
   
  save(NODE   *head)  
  {  
   
    char   name[10];  
    NODE   *p,*q;  
    FILE   *fp;  
    p=q=head;  
    printf("please   enter   the   name   you   want   to   save:\n");  
    scanf("%s",&name);  
    fp=fopen(name,"wb");  
    while(p->next!=NULL)  
    {  
      fprintf(fp,"%s%s%s%s",p->name,p->adr,p->tel,p->email);  
      p=q->next;  
      q=p;  
    }  
    fclose(fp);  
   
  }  
   
  display(NODE   *head)  
  {  
    NODE   *p   ;  
    p=head;  
   
    printf("\n\n******name*************address************telephone*********email*************\n");  
   
    while(p!=NULL)  
      {  
        printf("       %s                 %s                       %s                       %s\n",p->name,p->adr,p->tel,p->email);  
        p=p->next   ;  
    }  
   
  }  
  NODE   *load()  
  {  
    char   name[10];  
    NODE   *p,*q,*r;  
    FILE   *fp1;  
    p=q=r=(NODE   *)malloc(LENGTH);  
   
    N=0;  
    printf("\n   please   enter   the   file   name:");  
    scanf("%s",name);  
    fp1=fopen(name,"rb");  
    if(fp1==NULL)  
    {  
      printf("\nthe   file   doesn't   exist!");  
      exit();  
    }  
    else  
    {  
      while(!feof(fp1))  
      {  
        N++;  
        if(N!=1)  
          {  
            p=(NODE   *)malloc(LENGTH);  
            p=q->next;  
            q=p;  
          }  
          fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);  
          printf("       %s   \t                     %s   \t                     %s   \t                     %s\n",p->name,p->adr,p->tel,p->email);  
        }  
        p->next=NULL;  
   
    }  
        fclose(fp1);  
        return(r);  
  }  
  main()/*实现创建一个新链表*/  
  {  
    NODE   *p,*q,*r,*s;  
    char   name[10];  
    N=0;  
    printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
    scanf("%s",name);  
    while(strcmp(name,"0")!=0)  
    {  
        N++;  
        p=(NODE   *)malloc(LENGTH);  
        strcpy(p->name,name);  
        printf("please   enter   his   address(<=20):");  
        scanf("%s",p->adr);  
        printf("please   enter   his   tel(<=13):");  
        scanf("%s",p->tel);  
        printf("please   enter   his   email(<=20):");  
        scanf("%s",p->email);  
        if(N=1)     r=p;  
        else   q->next=p;  
          q=p;  
   
          printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
          scanf("%s",name);  
    }  
    p->next=NULL;  
    display(r);//把输入的内容显示出来  
    s=load();//打开原来的文件  
    display(s);//显示打开的内容  
    getch();//由于我的系统是xp就加了个这个  
  }Top

4 楼jsjwql(wql)回复于 2003-12-02 18:31:29 得分 0

二进制与字符的格式都用了!不知道是什么问题!谢谢Top

5 楼jsjwql(wql)回复于 2003-12-02 18:34:31 得分 0

display(r);//把输入的内容显示出来  
    s=load();//打开原来的文件  
    display(s);//显示打开的内容  
    getch();//由于我的系统是xp就加了个这个  
   
  在少贴了个东西save(r)  
  display(r);//把输入的内容显示出来  
    save(r);//把链表中的东西保存起来  
  s=load();//打开原来的文件  
    display(s);//显示打开的内容  
    getch();//由于我的系统是xp就加了个这个Top

6 楼chenzhuo(睡到自然醒)回复于 2003-12-02 19:00:57 得分 0

struct   node  
  {  
    char   name[10];  
    char   adr[20];  
    char   tel[13];  
    char   email[20];  
    struct   node   *next;  
  };  
  这里的定义出问题,如果你定义了char   name[10]这时候你不可以输入一个10字符给name.  
  不然就会出现这种情况,如果是10个字符以下就没问题.因为它要存'\0'.  
  你试一下定义为char   name[11];  
  输入时就这样  
  do   {scanf("%s",xxx.name);}while(!(strlen(xxx.name)>0&&strlen(xxx.name)<11));Top

7 楼jsjwql(wql)回复于 2003-12-02 20:33:14 得分 0

谢谢  
  但是我使用的名字在10以内的时候都不行  
  上面的代码帖的时候好象有点问题,下面的通过编译了,你们可以运行看看,是个什么情况  
  #include"stdio.h"  
  #include"malloc.h"  
  #define   LENGTH   sizeof(struct   node)  
  struct   node  
  {  
    char   name[10];  
    char   adr[20];  
    char   tel[13];  
    char   email[20];  
    struct   node   *next;  
  };  
   
  typedef   struct   node   NODE;  
  int   N;  
   
   
   
  save(NODE   *head)  
  {  
   
    char   name[10];  
    NODE   *p,*q;  
    FILE   *fp;  
    p=q=head;  
    printf("please   enter   the   name   you   want   to   save:\n");  
    scanf("%s",&name);  
    fp=fopen(name,"wb");  
    while(p->next!=NULL)  
    {  
      fprintf(fp,"%s%s%s%s",p->name,p->adr,p->tel,p->email);  
      p=q->next;  
      q=p;  
    }  
    fclose(fp);  
   
  }  
   
  display(NODE   *head)  
  {  
    NODE   *p   ;  
    p=head;  
   
    printf("\n\n******name*************address************telephone*********email*************\n");  
   
    while(p!=NULL)  
      {  
        printf("       %s                 %s                       %s                       %s\n",p->name,p->adr,p->tel,p->email);  
        p=p->next   ;  
    }  
   
  }  
  NODE   *load()  
  {  
    char   name[10];  
    NODE   *p,*q,*r;  
    FILE   *fp1;  
    p=q=r=(NODE   *)malloc(LENGTH);  
   
    N=0;  
    printf("\n   please   enter   the   file   name   you   want   to   open:");  
    scanf("%s",name);  
    fp1=fopen(name,"rb");  
    if(fp1==NULL)  
    {  
      printf("\nthe   file   doesn't   exist!");  
      exit();  
    }  
    else  
    {  
      while(!feof(fp1))  
      {  
        N++;  
        if(N!=1)  
          {  
            p=(NODE   *)malloc(LENGTH);  
            p=q->next;  
            q=p;  
          }  
          fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);  
          printf("       %s   \t                     %s   \t                     %s   \t                     %s\n",p->name,p->adr,p->tel,p->email);  
        }  
        p->next=NULL;  
   
    }  
        fclose(fp1);  
        return(r);  
  }  
   
  main()/*实现创建一个新链表*/  
  {  
    NODE   *p,*q,*r,*s;  
    char   name[10];  
    N=0;  
    printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
    scanf("%s",name);  
    while(strcmp(name,"0")!=0)  
    {  
        N++;  
        p=(NODE   *)malloc(LENGTH);  
        strcpy(p->name,name);  
        printf("please   enter   his   address(<=20):");  
        scanf("%s",p->adr);  
        printf("please   enter   his   tel(<=13):");  
        scanf("%s",p->tel);  
        printf("please   enter   his   email(<=20):");  
        scanf("%s",p->email);  
        if(N=1)     r=p;  
        else   q->next=p;  
          q=p;  
   
          printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
          scanf("%s",name);  
    }  
    p->next=NULL;  
    display(r);  
    save(r);  
    s=load();  
    display(s);  
    getch();  
   
  }  
  Top

8 楼chenzhuo(睡到自然醒)回复于 2003-12-02 21:07:34 得分 0

你把文件的所有记录删除掉先!Top

9 楼antijpn(antijpn)回复于 2003-12-02 21:15:20 得分 0

好像根本就没有能成功的写入文件,至少我在VC++7.1下面编译之后不能写文件Top

10 楼zhangfjj(小张)回复于 2003-12-02 21:20:08 得分 0

display(r);//是在这个地方显示乱码?  
    save(r);  
    s=load();  
    display(s);//还是这个地方显示乱码?还是两处都显示乱码?再输入的是不是全英文?  
    getch();  
  Top

11 楼antijpn(antijpn)回复于 2003-12-02 21:24:36 得分 0

里面还有不少问题,例如只有malloc,没有free  
  还有fprintf("%s%s%s%s"会把你的内容胡子连着眉毛保存在一起,读出来肯定是不对的  
   
  暂且我也只能找到这么多,没仔细调,有空的话等会儿帮你调一下试试看Top

12 楼phoenixli(feitian)回复于 2003-12-02 21:53:05 得分 0

同意zhangfjj的话,我在VC6。0下编译跟踪,在save()里的fopen(),并没有写入文件。文件不存在。Top

13 楼chenzhuo(睡到自然醒)回复于 2003-12-02 21:59:45 得分 0

fprintf("%S%s%s%...........)这里改为fwrite(p,LENGTh,1,fp);试试!!!Top

14 楼antijpn(antijpn)回复于 2003-12-02 22:09:59 得分 0

主要是p->next!=NULL一句有问题,我也懒得查了,连个注释都没有,main()里面放了那么一堆的NODE*,也不知道干什么用的,去掉几个没用的再说!简直就是浪费内存!  
  上面的方法我已经用过了,我现在的代码可以保存文件了,但是还是有错,贴给你看一下好了  
   
  #include   "stdafx.h"  
  #include   <stdio.h>  
  #include   <malloc.h>  
  //#define   LENGTH   sizeof(struct   node)  
  struct   node  
  {  
  char   name[10];  
  char   adr[20];  
  char   tel[13];  
  char   email[20];  
  struct   node   *next;  
  };  
   
  typedef   struct   node   NODE;  
  int   LENGTH=sizeof(struct   node);  
  int   N;  
   
   
   
  save(NODE   *head)  
  {  
   
  char   name[10];  
  NODE   *p,*q;  
  FILE   *fp;  
  p=q=head;  
  printf("please   enter   the   name   you   want   to   save:\n");  
  scanf("%s",&name);  
  fp=fopen(name,"wb");  
  while(p!=NULL)  
  {  
  fwrite(p,LENGTH,1,fp);  
  p=q->next;  
  q=p;  
  if(p->next==NULL)  
  break;  
  }  
  fclose(fp);  
  }  
   
  void   display(NODE   *head)  
  {  
  NODE   *p   ;  
  p=head;  
   
  printf("\n\n******name*************address************telephone*********email*************\n");  
   
  while(p!=NULL)  
  {  
  printf("       %s                 %s                       %s                       %s\n",p->name,p->adr,p->tel,p->email);  
  p=p->next   ;  
  }  
   
  }  
   
  NODE   *load()  
  {  
  char   name[10];  
  NODE   *p,*q,*r;  
  FILE   *fp1;  
  p=q=r=(NODE   *)malloc(LENGTH);  
   
  N=0;  
  printf("\n   please   enter   the   file   name   you   want   to   open:");  
  scanf("%s",name);  
  fp1=fopen(name,"rb");  
  if(fp1==NULL)  
  {  
  printf("\nthe   file   doesn't   exist!");  
  exit(0);  
  }  
  else  
  {  
  while(!feof(fp1))  
  {  
  N++;  
  if(N!=1)  
  {  
  p=(NODE   *)malloc(LENGTH);  
  p=q->next;  
  q=p;  
  }  
  fread(p,LENGTH,1,fp1);  
  printf("       %s   \t                     %s   \t                     %s   \t                     %s\n",p->name,p->adr,p->tel,p->email);  
  }  
  p->next=NULL;  
   
  }  
  fclose(fp1);  
  return(r);  
  }  
   
  main()/*实现创建一个新链表*/  
  {  
  // int   LENGTH=sizeof(struct   node);  
  NODE   *p,*q,*r,*s;  
  char   name[10];  
  N=0;  
  printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
  scanf("%s",name);  
  while(strcmp(name,"0")!=0)  
  {  
  N++;  
  p=(NODE   *)malloc(LENGTH);  
  strcpy(p->name,name);  
  printf("please   enter   his   address(<=20):");  
  scanf("%s",p->adr);  
  printf("please   enter   his   tel(<=13):");  
  scanf("%s",p->tel);  
  printf("please   enter   his   email(<=20):");  
  scanf("%s",p->email);  
  if(N=1)  
  r=p;  
  else  
  q->next=p;  
  q=p;  
   
  printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
  scanf("%s",name);  
  }  
  p->next=NULL;  
  display(r);  
  save(r);  
  s=load();  
  display(s);  
  system("pause");  
  // getch();  
   
  }  
   
   
  反正你代码里面的那一堆NODE*真是看了就不爽,你自己看着解决好了。  
  我跟踪到save()函数的时候,在while的循环里面有问题。Top

15 楼zhangfjj(小张)回复于 2003-12-06 23:33:38 得分 0

几天来在这里花了不少时间帮助解决了若干个关于文件操作的问题,有些收获,对于你的程序也是一样的,我没有看你关于链表的操作,只是对你文件操作提出几点意见,可能会对你有帮助,你重新把代码写一遍,我敢保证不再会出现问题了。  
   
  1)注意文件打开方式,指文本方式和二进制方式,fgetc()fputc()fscanf()fprintf()fgets()fputs()支持文本方式,fread()和fwrite()支持二进制方式。  
  2)在你的每一个函数中,先打开文件,操作完毕后,再关闭文件,即将文件的打开与关闭“封装”在函数中,呵呵,^_^   ,借用C++的一个词,这样你在写函数时不用关心文件的状态,只要专注于函数的其他方面了。  
  Top

16 楼zhangfjj(小张)回复于 2003-12-06 23:40:51 得分 10

3)注意函数名的取名,我碰到过一次,他给他的函数叫read(),结果花了我一下午带一晚上的时间,最后发现read()函数与系统低层调用read冲突,  
  4)在定义字符数组保存字符串时,一定要注意字符串的长度,保证字符串的'\0'能被存储在字符数组中。  
  你只要注意了以上四点,肯定能成功。  
  开始烦写文件操作的代码了,(这几天写得太多了。。。)最后祝你取得最后的胜利!!!Top

17 楼Sodier(逍遥神剑)回复于 2003-12-07 02:41:17 得分 0

下面的程序可以运行了,搂主的程序里有好多小错误,自己对照着检查吧  
   
   
  #include"stdio.h"  
  #include"malloc.h"  
  #include"stdlib.h"  
  #include"conio.h"  
  #include"string.h"  
  #define   LENGTH   sizeof(struct   node)  
  struct   node  
  {  
    char   name[10];  
    char   adr[20];  
    char   tel[13];  
    char   email[20];  
    struct   node   *next;  
  };  
   
  typedef   struct   node   NODE;  
  int   N;  
   
   
   
  void   save(NODE   *head)//把链表中的记录存入文件  
  {  
   
    char   name[10];  
    NODE   *p,*q;  
    FILE   *fp;  
    p=q=head;  
    printf("please   enter   the   name   you   want   to   save:\n");//   输入文件名  
    scanf("%s",name);  
    fp=fopen(name,"w");  
    while(p!=NULL)  
    {  
      fprintf(fp,"%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);  
      p=p->next;  
    }  
    fclose(fp);  
   
  }  
   
  void   display(NODE   *head)//把链表中的记录输出至标准输出设备  
  {  
    NODE   *p   ;  
    p=head;  
   
    printf("\n\n******name*************address************telephone*********email*************\n");  
   
    while(p!=NULL)  
      {  
        printf("%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);  
        p=p->next   ;  
    }  
   
  }  
  NODE   *load()//把文件中的记录输出至显示器  
  {  
    char   name[20];  
    NODE   *p,*r,*q;  
    FILE   *fp1;  
    int   i=0;  
    p=r=(NODE   *)malloc(LENGTH);  
   
    //N=0;  
    printf("\n   please   enter   the   file   name:");  
    scanf("%s",name);  
    fp1=fopen(name,"r");  
    if(fp1==NULL)  
    {  
      printf("\nthe   file   doesn't   exist!");  
      exit(1);  
    }  
    else  
    {  
      while(i<N)  
      {  
          fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);  
          printf("%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);  
  i++;  
  q=p;  
  p->next=(NODE   *)malloc(LENGTH);  
  p=p->next;  
      }  
      free(p);  
      q->next=NULL;  
    }  
        fclose(fp1);  
        return(r);  
  }  
  void   main()/*实现创建一个新链表*/  
  {  
    NODE   *p,*q,*r,*s;  
    char   name[10];  
    N=0;  
    printf("please   enter   the   name(if   you   want   exit,please   enter   'n')(<=10):");  
    scanf("%s",name);  
    if(strcmp(name,"0")!=0)  
    {  
  p=(NODE   *)malloc(LENGTH);  
  while(strcmp(name,"0")!=0)  
  {  
  N++;  
  //p=(NODE   *)malloc(LENGTH);  
  strcpy(p->name,name);  
  printf("please   enter   his   address(<=20):");  
  scanf("%s",p->adr);  
  printf("please   enter   his   tel(<=13):");  
  scanf("%s",p->tel);  
  printf("please   enter   his   email(<=20):");  
  scanf("%s",p->email);  
  if(N==1)     r=p;  
  q=p;  
  p=(NODE   *)malloc(LENGTH);  
  q->next=p;  
  p->next=NULL;  
  printf("please   enter   the   name(if   you   want   exit,please   enter   0)(<=10):");  
  scanf("%s",name);  
  }  
  q->next=NULL;  
  free(p);  
  display(r);//把输入的内容显示出来  
  save(r);  
  s=load();//打开原来的文件  
  display(s);//显示打开的内容  
  //getch();//由于我的系统是xp就加了个这个  
  }  
  }  
  Top

相关问题

  • 怎么把.html文件里得所有字符读出来呢?
  • 怎么从结构文件中读出中文字符呢?
  • 怎么读出文件中的一个汉字字符啊?
  • 请问:如何读出用Foxpro存储的一系列DBF文件的数据,再把它拼成已制定好的XML格式的字符窜输出。
  • 为啥不能读出数据库里的字符串??
  • 如何将datagrid数据读出来到一字符串中呢
  • 怎样对文本文件一次读出一行到字符串里?
  • eVC中怎样将文件中读出的ASCII字符转换成UNICODE?
  • 如何实现从文件中一次读出一个字符的操作?
  • 最快的读出文件配置和最高效率的查找字符串!!!

关键词

  • 文件
  • 字符
  • 函数
  • 二进制
  • 代码
  • 解决
  • tel
  • adr
  • node
  • please enter

得分解答快速导航

  • 帖主:jsjwql
  • antijpn
  • zhangfjj

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo