| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 933 人关注过本帖
标题:请帮我给下面的程序加个读取文件的代码,目前其实我还不知道这个代码所有的 ...
取消只看楼主 加入收藏
心念成
Rank: 2
等 级:论坛游民
帖 子:19
专家分:27
注 册:2015-12-31
结帖率:100%
收藏
 问题点数:0 回复次数:0 
请帮我给下面的程序加个读取文件的代码,目前其实我还不知道这个代码所有的意思
  这是个课设,我选的太难了,不会

#include <stdio.h>   
  #include <malloc.h>   
  #include <string.h>   
  #include <stdlib.h>   
  #include <ctype.h>   
  #define   NULL   0   
  #define   MAX   100   
   
  typedef   struct   lnode{   
   
   
  char   date[MAX];                       //存放数据   
  struct   lnode   *   prior   ;          //前驱   
  struct   lnode   *   next   ;           //后继   
  int   number   ;                       //记录一个节点的字符数!如果是头节点就记录他的节点个数   
  int   quese   ;                        //记录节点在链表中的位置   
   
   
  }lnodetype;   
   
  lnodetype   *   l   ;   //设置两个全局变量,分别是头节点指针和尾节点指针   
  lnodetype   *   end   ;   
   
   
  //**********这个函数是用来初始化的**********//   
  int   iniatelist   (lnodetype   **   l   ,   lnodetype   **   end)   
  {   
   
  (*l)   =   (lnodetype   *)malloc   (sizeof   (lnodetype)   )   ;   
  if   (   (*l)   ==   NULL   )   
  {   
   
  printf   ("没有足够的内存空间!程序即将退出!");   
  return   0   ;   
   
  }   
   
  (*l)->prior   =(*l)->next   =   NULL   ;   //这是双链表   
  (*l)->number   =   (*l)->quese   =   0;   
  (*end)   =   (*l)   ;   
   
  printf   ("程序初始化完毕!\n");   
  return   0;   
   
  }   
   
   
   
  //**********这个函数是用来建立节点,并且插入元素的**********//   
  int   link(lnodetype   **   l,   lnodetype   **   end)   
  {   
   
  lnodetype   *s   ;   
  s   =   (lnodetype   *)malloc   (   sizeof   (lnodetype)   )   ;   
  if   (   s   ==   NULL   ){   
   
  printf   ("内存空间不够,程序即将退出!")   ;   
  return   0   ;   
   
  }   
   
   
  (*end)->next   =   s   ;   
  s->prior   =   (*end)   ;   
  (*end)   =   (*end)->next   ;   
  (*l)->number++   ;   //增加一个节点,头节点的number就加1   
  s->quese   =   (*l)->number   ;   //这个是记录节点在链表中的位置   
   
  printf   ("%d行",   s->quese   )   ;   //这个是节点在整个链表中的位置   
  gets(s->date)   ;   
  s   ->   number   =   strlen(s->date)   ;   
  return   0   ;   
   
   
  }   
   
   
   
  //**********这个是打印链表的函数**********//   
  int   prin   (lnodetype   **   l,   lnodetype   **   end)   
  {   
   
  lnodetype   *   p   ;   
  int   i   ;   
  int   j   =   0;   
  int   couter   =   (*l)->number   ;   
  p   =   (*l)->next   ;   
   
  for   (i=0;   i   <   couter;   i++){   
   
  printf   (   "%d行"   ,   i+1   )   ;   
  j   =   0;   
  while   (   (   p->date[j]>='a'   &&   p->date[j]<='z')   ||   
  (p->date[j]>='A'   &&   p->date[j]<='z')   ||   
    p->date[j]>='0'   &&   p->date[j]<='9')   
  {   
   
  printf   (   "%c"   ,   p->date[j]   )   ;   
  j++   ;   
   
  }   
  printf   ("\n")   ;   
  p   =   p->next   ;   
   
  }   
   
  return   0   ;   
   
  }   
   
   
   
  //*********这个查找和编辑相应行的函数**********//   
  int   search   (lnodetype   **   l,   lnodetype   **   end   )   
  {   
   
   
  int   number   ;   
  scanf   ("%d"   ,   &number)   ;   
  int   i   ;   
  lnodetype   *   p   ;   
  p   =   (*l)->next   ;   
   
  for   (   i=0;   i<number-1;   i++   )   
  p   =   p->next   ;   
   
  printf   ("%d行"   ,   number   )   ;   
  gets   (p->date)   ;   
  return   0   ;   
   
   
   
  }   
   
   
  //**********这个是在文本文件里搜索字符串的函数**********//   
  int   searchstr(lnodetype   **   l   ,   lnodetype   **   end)   
  {   
   
   
  char   ptr[100]   ;   
  int   arrycouter   ;   
  int   mystrcmp(   char   *,   char   *   ,   int   )   ;   
   
  printf   (   "ok!现在输入你查找的字符串!"   )   ;   
  scanf   (   "%s"   ,   ptr   )   ;   
  arrycouter   =   strlen   (ptr)   ;   
  lnodetype   *   s   ;   
  s   =   (*l)->next   ;   
  char   *   p   ;   
   
  int   i   =   1   ;   
  int   couter   =   0   ;   
  int   number   =   (*l)->number   ;   
  p   =   (char   *)s->date   ;   
   
   
  while   (   i   &&   number   ){   
   
                                          //   i=1是,证明没有找到,向第二个节点继续寻找   
   
  while   (   i   &&   (   (   (*p   >=   'a')   &&   (*p   <=   'z')   )   ||   (   (*p   >=   'A')   &&   (*p   <=   'Z')   )   )   ){   
   
   
  i   =   mystrcmp   (   p   ,   ptr   ,   arrycouter   );   
   
   
  if   (   i   ==   1   ){   
   
  printf   ("字符串已经在第%d行,第%d个字符开始,",s->quese,   couter+1   );   
  i   =   0   ;   
  }   
  else   
  {   
   p++   ;   
   couter++;   
   i = 1   ;   
  }   
   
  }   
   
  s   =   s->next   ;   
  p   =   (char   *)s->date   ;   
  number   --   ;   
   
  }   
   
  if   (   i   ==   1   )   
  printf   ("字符串在本文档中不存在!\n");   
  return   0   ;   
   
   
  }   
   
   
  //**********(1)这个函数是用来实现退出不保存功能的**********//   
  int   exitunsave(lnodetype   **   l,   lnodetype   **   end)   
  {   
   
  lnodetype   *   s   ;   
  while(   (*l)   !=   (*end)   ){   //如果不保存的话,最好是把节点的空间都释放,节省空间   
   
  s   =   (*end)   ;   
  (*end)   =   (*end)->prior   ;   
  free(   s   )   ;   
   
  }   
   
  return   0   ;   
   
   
  }   
   
   
  //**********(2)这个函数是用来实现退出但保存功能的**********//   
  int   quitandsave(   lnodetype   **   l   ,   lnodetype   **   end   )   
  {   
   
  FILE   *   fp   ;   
  char   ch   ;   
  char   filename[20]   ;   
  lnodetype   *   p;   
  int   i   ;   
  int   j   ;   
  int   couter   =   (*l)->number   ;   
   
  p   =   (*l)->next   ;   
   
  printf   ("请输入文件名:")   ;   
  scanf   ("%s"   ,   filename   )   ;   
   
  if   (   (fp   =   fopen(   filename   ,   "w"   ))   ==   NULL   ){   
   
  printf   ("文件不能打开!\n");   
  return   0   ;   
   
  }   
   
   
  for   (   i=0;   i<couter;   i++   ){   //有几个节点就进行多少次的存贮   
   
  ch   =   p->date[0]   ;   
  j   =   1   ;   
   
  while   (ch   !=   '\0'){   
   
  fputc   (ch   ,   fp)   ;   
  ch   =   p->date[j]   ;   
  j++   ;   
   
  }   
   
  p   =   p->next   ;   
  fputc   (   '#'   ,   fp   )   ;   //注意在每个节点的后面加上结束的符号   
   
  }   
   
   
  fputc   (   '@'   ,   fp   )   ;   //整个文件关闭的标志   
  fclose   (   fp   )   ;   //注意关闭文件,   
  return   0   ;   
   
  }   
  //**********由于库函数比较字符串提供的功能不满足要求,故自己写了一个**********/   
  int   mystrcmp(   char   *   p   ,char   *   sour   ,int   number   )   
  {   
   
  while   (   number   &&   (*p)   ==   (*sour)   &&   
  (   (   (*p   >=   'a')   &&   (*p   <=   'z')   )   ||   (   (*p   >=   'A')   &&   (*p   <=   'Z')   )   )){   
   
  p++   ;   
  sour++   ;   
  number--   ;   
   
  }   
   
   
  if   (   number   ==   0   )   
  return   1   ;   
  else   
  return   0   ;   
   
   
  }   
  //**********这个函数是用来实现统计字符串功能的**********//   
  int   coutword(lnodetype   **   l   ,   lnodetype   **   end)   
  {   //考虑到只统计一行的单词没有意义,故统计整个文本   
   
  int   yes   =   1   ;   //这个是进入单词的标志   
  int   no   =   0   ;   //在单词外面的时候的标志   
  int   i   ,   j   ,inaword   ,count   =   0   ;   
  inaword   =   no   ;   
  lnodetype   *   s   =   (*l)->next   ;   
   
  for   (j=0;   j<(*l)->number;   j++){   
   
  for   (   i=0;     (s->date[i]>='a'   &&   s->date[i]<='z')   ||   
  (s->date[i]>='A'   &&   s->date[i]<='z')   ||   
  (s->date[i]>='0'   &&   s->date[i]<='9'   )   ||   
  (s->date[i]==  '    ');     i++     )   
  {   
   
  if   (   s->date[i]   ==   '   '   )   
  inaword   =   no   ;   
  else   
  if   (   inaword   ==   no   )   
  {   
  inaword   =   yes   ;   
  count++   ;   //计算单词   
  }   
   
   
  }   
   
  s   =   s->next   ;   
  inaword   =   0   ;   //注意这里,把标志置为0了!   
   
  }   
   
  printf   ("n此文本一共有   %d       行"   ,   (*l)->number   )   ;   
  printf   ("n此文本一共有   %d   个单词!"   ,   count   )   ;   
   
  return   count   ;   
   
   
  }   
//**********这个函数是用来实现计算文本行数功能的**********//   
  int   linecouter(lnodetype   **   l   ,   lnodetype   **   end   )   
  {   
   
  int   couter   ;   
  couter   =   (*l)->number   ;   
  return   couter   ;   
   
  }   
   
  //**********这个函数是整和一上所有功能的菜单函数**********//   
  int   editmenu(lnodetype   **   l   ,   lnodetype   **   end   )   
  {   
   
   
  char   choice   ;   
  char   *   p   =   "cls"   ;   
  int   i   =   1   ;   //这两个变量是用来控制循环的   
  int   j=   1   ;   
  system   (p)   ;   
  prin   (&(*l)   ,   &(*end))   ;   
   
  while   (j){   
   
  printf   ("*****************************   e:   编辑相应行       ******************************\n")   ;   
  printf   ("*****************************   s:   搜索字符串       ******************************\n")   ;   
  printf   ("*****************************   t:   统计单词个数     ******************************\n")   ;   
  printf   ("*****************************   q:   退出编辑         ******************************\n")   ;   

  scanf("%c",    &choice);   
  scanf("%c",   &choice)   ;   //????莫名其妙的问题,非要两个请求输入语句才肯停下来!   
  switch   (choice)   
  {   
  case   'e'   :   {   
  i   =   1   ;   
  while   (i)   
  {   
  search(   &(*l)   ,   &(*end)   );   
  system   (p)   ;   
  prin(   &(*l)   ,   &(*end)   )   ;   
  printf   ("1   继续编辑\n0\n   结束编辑\n")   ;   
  scanf   ("%d"   ,   &i)   ;   
   
  }   
   
  }   
   
  break;   
  case   's'   :   {   
   
  i   =   1   ;   
  while   (i)   
  {   
  searchstr(   &(*l)   ,   &(*end)   );   
  getchar();   
  getchar();   
  system   (p)   ;   
  prin(   &(*l)   ,   &(*end)   )   ;   
  printf   ("1   继续搜索\n0   结束搜索\n")   ;   
  scanf   ("%d"   ,   &i)   ;   
   
  }   
   
   
          }   
  break;   
  case   't'   :   {   
   
  coutword   (   &(*l)   ,   &(*end)   )   ;   
  getchar()   ;   
   
   
  }break;   
   
  default   :   return   0   ;   
   
   
  }   
   
  system   (p)   ;   
  prin(   &(*l)   ,   &(*end)   )   ;   
  printf   ("1   回到编辑菜单\n0   结束编辑\n")   ;   
  scanf   ("%d"   ,   &j)   ;   
  if   (j   ==   1)   
  system   (p)   ;   
  else   
  return   0   ;   
   
  }   
   
   
  return   0   ;   
  }   
   
   
  //**********实现第一个模块:新建空白文档**********//   
  int   newtext(   lnodetype   **   l   ,lnodetype   **   end   )   
  {   
   
  printf   (   "新文本文件:\n"   )   ;   
  int   i   =   1   ;   
  char   judstr[MAX]   ;   
  lnodetype   *   temp   ;   
  char   jud   ;   
  char   *      p=   "cls"   ;   
   
  while   (   1   ){   
   
  link(   &(*l)   ,   &(*end)   )   ;   
  jud   =   (*end)->date[0]   ;   
   
  if   (   jud   ==   'Q'   ){   //输入‘Q’结束一切   
   
  temp   =   (*end)   ;   
  (*end)   =   (*end)->prior   ;   
  free   (temp)   ;   
   
  while   (1){   
   
  printf   (   "************************     0   :退出不保存      ***********************\n")   ;      
  printf   (   "************************     1   :退出而不存盘     **********************\n")   ;   
  printf   (   "************************     2   :退出且存盘       **********************\n")   ;   
  printf   (   "************************     3   :继续输入!      ***********************\n")   ;
  printf   (   "************************     4   :编辑信息         **********************\n")   ;  

  gets(judstr)   ;   
   
  if   (   !strcmp(judstr   ,   "0")   )   
  {   
  exitunsave(   &(*l)   ,   &(*end)   )   ;   
  return   0   ;   
  }   
  else   
  if   (   !strcmp(judstr   ,   "2")   )   
  {   
  quitandsave(   &(*l)   ,   &(*end)   )   ;   
  return   0   ;   
  }   
  else   
   
  if   (   !strcmp(judstr   ,   "4")   )   
  {   
   
  editmenu   (l   ,   end)   ;   
  return   0;   
   
  }   
   
   
  system   (p)   ;   
   
   
   
   
   
  }   
  return   0   ;   
   
  }   
   
  }   
   
  return   0   ;   
   
   
  }   
   
   
  //**********这个是装入文件的函数**********//   
  int   loadtaxt(   char   *   filename   )   
  {   
   
  FILE   *   fp   ;   
  lnodetype   *   l   ;   
  char   ch   ;   
  int   i   =   0   ;   
  char   *   p   =   "cls"   ;   
  char   judstr[MAX]   ;   
  lnodetype   *   head   ;   
  lnodetype   *   end   ;   
   
  iniatelist   (   &head   ,   &end)   ;   
  l   =   end   =   head   ;   
   
  if   (   (fp   =   fopen(   filename,   "r+"))   ==   NULL   ){   
   
  printf   ("文件不能打开!\n")   ;   
  return   0   ;   
   
  }   
   
  ch   =   fgetc   (   fp   )   ;   
  while   (   ch   !=   '@'   ){   
   
  lnodetype   *s   ;   
  s   =   (lnodetype   *)malloc   (   sizeof   (lnodetype)   )   ;   
  if   (   s   ==   NULL   ){   
   
  printf   ("内存空间不够,程序即将退出!\n")   ;   
  return   0   ;   
   
  }   
   
   
  end->next   =   s   ;   
  s->prior   =   end   ;   
  end   =   end->next   ;   
  l->number++   ;   
  s->quese   =   l->number   ;   
  printf   ("%d行",   s->quese   )   ;   
   
   
  while   (   ch   !=   '#'){   
   
   
  s->date[i]   =   ch   ;   
  ch   =   fgetc   (fp)   ;   
  i++   ;   
   
   
  }   
  i   =   0;   
  while   (   (end->date[i]>='a'   &&   end->date[i]<='z')   ||   
  (end->date[i]>='A'   &&   end->date[i]<='z')   ||   
  (end->date[i]>='0'   &&   end->date[i]<='9'   )   ||   
  (end->date[i]=='   ')   )   
  {   
   
  printf   (   "%c"   ,   end->date[i]   )   ;   
  i++   ;   
   
   
  }   
  end->date[i]   =   '\0'   ;   //注意在节点的最好加上这个,以让退出保存功能函数知道此节点已结束   
   
  printf   (   "\n"   )   ;   
  i   =   0;   
  ch   =   fgetc   (   fp   )   ;   
   
  }   
   
  fclose   (fp)   ;   
   
   
  printf   ("n文件成功装入!\n")   ;   
  while   (1){   
   
  printf   (   "**************************     0     :退出不保存     *************************\n")   ;   
  printf   (   "**************************     1     :编辑信息       *************************\n")   ;   
  printf   (   "**************************     2     :退出且存盘     *************************\n")   ;   
  printf   (   "**************************     3     :继续输入!     *************************\n")   ;   
   
  scanf("%s",judstr);   
   
  if   (   !strcmp(judstr   ,   "0")   )   
  {   
  exitunsave(   &l   ,   &end   )   ;   
  return   0   ;   
  }   
  else   
  if   (   !strcmp(judstr   ,   "2")   )   
  {   
  quitandsave(   &l   ,   &end   )   ;   
  return   0   ;   
  }   
  else   
   
  if   (   !strcmp(judstr   ,   "4")   )   
  {   
   
  editmenu   (&l   ,   &end)   ;   
  return   0   ;   
   
  }   

  system   (p)   ;   

  }   
  return   0   ;   
  }   
   
  //**********主函数**********//   
   
  int   main   ()   
  {   
   
  iniatelist   (&l   ,   &end)   ;   
  newtext(&l   ,   &end)   ;   
   
  char   filename[MAX]   ;   
  scanf   (   "%s"   ,   filename   )   ;   
  loadtaxt(   filename   )   ;   
   
   
  }
搜索更多相关主题的帖子: include number 记录 
2016-01-02 12:45
快速回复:请帮我给下面的程序加个读取文件的代码,目前其实我还不知道这个代码所 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022769 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved