免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3010 | 回复: 1
打印 上一主题 下一主题

[C] 请教:C语言读写文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-22 17:16 |只看该作者 |倒序浏览
      下面这个程序的目的是从command line接收两个文件的文件名,然后判断哪个文件里的文本行数较多,最后将两个文件里的行号相同的文本打印在屏幕上的同一行里。但不知怎的,编译通过后运行时却老是出错,请帮忙看看是怎么回事。谢谢!
  1. /* ex7, ch13, cl ver. */

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define MAX 256

  5. int main(int argc, char *argv[])
  6. {
  7.         FILE * f1, *f2, *fp1, *fp2;
  8.         char buf1[MAX], buf2[MAX], ch, *buf = buf1;                 //buf用作将从文件1中读出的一行去除换行符
  9.               long cnt1 = 0, cnt2 = 0;

  10.         if(argc != 3)
  11.         {
  12.                 printf("Usage: %s file1 file2", argv[0]);
  13.                 exit(EXIT_FAILURE);
  14.         }
  15.         if((f1 = fopen(argv[1], "r")) == NULL)
  16.         {
  17.                 fprintf(stderr, "Error opening %s", argv[1]);
  18.                 exit(EXIT_FAILURE);
  19.         }
  20.         if((f2 = fopen(argv[2], "r")) == NULL)
  21.         {
  22.                 fprintf(stderr, "Error opening %s", argv[2]);
  23.                 exit(EXIT_FAILURE);
  24.         }
  25.         while((ch = getc(f1)) != EOF)         //以下是判断哪个文件行数较多,将行数多的文件作为文件1
  26.                 cnt1++;
  27.         while((ch = getc(f2)) != EOF)
  28.                 cnt2++;
  29.         if(cnt1 >= cnt2)
  30.         {
  31.                 fp1 = f1;
  32.                 fp2 = f2;
  33.         }
  34.         else
  35.         {
  36.                 fp1 = f2;
  37.                 fp2 = f1;
  38.         }
  39.         rewind(f1);                                   //文件指针位置归零
  40.         rewind(f2);
  41.         while(fgets(buf, MAX, fp1) != NULL)                         //从文件1中读取一行
  42.         {
  43.                 while(*++buf != '\n')                                  //打印出这一行中除了换行符之外其他字符,问题也许就出在这里
  44.                                putchar(*buf);
  45.                 printf(" ");                                                  //两行在同一行打印,用空格隔开,以示区别
  46.                 while(fgets(buf2, MAX, fp2) != NULL)         //从文件2中读取一行并接着刚从文件1读出并打印的那一行接着打印
  47.                 {
  48.                         puts(buf2);
  49.                         break;
  50.                 }
  51.         }
  52.         fclose(f1);
  53.         fclose(f2);

  54.         puts("\nEnd of Program.");

  55.         return 0;
  56. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-09-22 17:36 |只看该作者
呵呵,我想出来了。原来问题出在这里。
  1. /* ex7, ch13, cl ver. */

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define MAX 256

  5. int main(int argc, char *argv[])
  6. {
  7.         FILE * f1, *f2, *fp1, *fp2;
  8.         char buf1[MAX], buf2[MAX], ch, *buf;        //这里的buf也不用初始化了,后面再说
  9.         long cnt1 = 0, cnt2 = 0;

  10.         if(argc != 3)
  11.         {
  12.                 printf("Usage: %s file1 file2", argv[0]);
  13.                 exit(EXIT_FAILURE);
  14.         }
  15.         if((f1 = fopen(argv[1], "r")) == NULL)
  16.         {
  17.                 fprintf(stderr, "Error opening %s", argv[1]);
  18.                 exit(EXIT_FAILURE);
  19.         }
  20.         if((f2 = fopen(argv[2], "r")) == NULL)
  21.         {
  22.                 fprintf(stderr, "Error opening %s", argv[2]);
  23.                 exit(EXIT_FAILURE);
  24.         }
  25.         while((ch = getc(f1)) != EOF)
  26.                 cnt1++;
  27.         while((ch = getc(f2)) != EOF)
  28.                 cnt2++;
  29.         if(cnt1 >= cnt2)
  30.         {
  31.                 fp1 = f1;
  32.                 fp2 = f2;
  33.         }
  34.         else
  35.         {
  36.                 fp1 = f2;
  37.                 fp2 = f1;
  38.         }
  39.         rewind(f1);
  40.         rewind(f2);
  41.         while(fgets(buf1, MAX, fp1) != NULL)
  42.         {
  43.         buf = buf1;     //buf经过一次循环之后所指向的是上一次打印的字符数组的最后一个元素,需要将其还原成新数组的首元素地址
  44.                 while(*++buf != '\n')
  45.             putchar(*buf);
  46.                 printf(" ");
  47.                 while(fgets(buf2, MAX, fp2) != NULL)
  48.                 {
  49.                         puts(buf2);
  50.                         break;
  51.                 }
  52.         }
  53.         fclose(f1);
  54.         fclose(f2);

  55.         puts("\nEnd of Program.");

  56.         return 0;
  57. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP