免费注册 查看新帖 |

Chinaunix

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

[C] 交替打印两个文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-20 10:36 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h> // for exit()
#define MAX 256

void display_two_file(FILE *,FILE *);

int main(int argc,char *argv[])
{
        FILE *fp1,*fp2;
       
        if(argc==3)
        {
                if((fp1=fopen(argv[1],"r"))==NULL)
                {
                        fprintf(stderr,"Can't open file %s\n",argv[1]);
                        exit(1);
                }
                if((fp2=fopen(argv[2],"r"))==NULL)
                {
                        fprintf(stderr,"Can't open file %s\n",argv[2]);
                        exit(2);
                }
                display_two_file(fp1,fp2);
                fclose(fp1);
                fclose(fp2);
        }
        else
                fprintf(stderr,"Usage: %s file file\n",argv[0]);
        return 0;
}

void display_two_file(FILE *fp1,FILE *fp2)
{
        char line[MAX];
       
        while(! feof(fp1) && ! feof(fp2))
        {
                fgets(line,MAX,fp1);
                fputs(line,stdout);
                fgets(line,MAX,fp2);
                fputs(line,stdout);
        }       
        while(! feof(fp1))
        {
                fgets(line,MAX,fp1);
                fputs(line,stdout);
        }
        while(! feof(fp2))
        {
                fgets(line,MAX,fp2);
                fputs(line,stdout);
        }

}
程序接收两个参数,交替打印文件的内容
a文件的内容是
a b
c
b文件的内容是
1 2
3
4 5
6
运行后的结果是
a b
1 2
c
3
3
4 5
6
6
好像每个文件的最后一行都打印了两次,为什么啊?求指点,C新手

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
2 [报告]
发表于 2012-08-20 10:40 |只看该作者
好像是feof用的不对,可以看一下这个函数的百度百科。

论坛徽章:
0
3 [报告]
发表于 2012-08-20 14:30 |只看该作者
t = {}

local i = 1

for line in io.lines("/home/huxk/workspace/lua/src/fn1.txt") do
        --print (line)
        t[i] = line
        i = i + 2
end

local i = 2

for line in io.lines("/home/huxk/workspace/lua/src/fn2.txt") do
        --print (line)
        t[i] = line
        i = i + 2
end

print ("count = " .. #t)

for i = 1,#t do
        if t[i] ~= nil then
                print(t[i])
        end
end

我练练手

论坛徽章:
0
4 [报告]
发表于 2012-08-20 16:54 |只看该作者
哎,怎么都没人回复啊。。。回复 3# huxk


   

论坛徽章:
0
5 [报告]
发表于 2012-08-20 22:56 |只看该作者
回复 4# xiaowh00


      这个原因是因为feof函数导致的,当文件指针已经在函数末尾的时候,除非再读一次导致发生I/O错误,
否则feof(fp)依然返回0,因此用这个作为判断条件会使得多循环一次,而这一次读取失败,buffer依然没有改变,所以看起来像是重复读了一次

论坛徽章:
0
6 [报告]
发表于 2012-08-21 08:52 |只看该作者
谢谢,你说的是对的,我昨天自己已经解决了这个问题,在输出之前,再加一个feof的判断,达到要求了,不过看起来好臃肿,哎,不知道有没有更好的办法

回复 5# luoyan_xy


   

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
7 [报告]
发表于 2012-08-21 15:25 |只看该作者
换了下思路:
  1. int display_two_file(FILE *fp1, FILE *fp2)
  2. {
  3.     char line[MAX];
  4.     int read_file1_done = 0, read_file2_done = 0;

  5.     while (!read_file1_done && !read_file2_done) {
  6.         if (!read_file1_done && (fgets(line, MAX, fp1) != NULL)) {
  7.             fputs(line, stdout);
  8.         } else {
  9.             if (!feof(fp1)) {
  10.                 perror("fgets error");
  11.                 return -1;
  12.             }
  13.             read_file1_done = 1;
  14.         }
  15.         if (!read_file2_done && (fgets(line, MAX, fp2) != NULL)) {
  16.             fputs(line, stdout);
  17.         } else {
  18.             if (!feof(fp2)) {
  19.                 perror("fgets error");
  20.                 return -1;
  21.             }
  22.             read_file2_done = 1;
  23.         }
  24.     }
  25. }
复制代码

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
8 [报告]
发表于 2012-08-21 15:30 |只看该作者
糟糕,更冗余了好像……  可以成为反面教材了

论坛徽章:
0
9 [报告]
发表于 2012-08-21 16:22 |只看该作者
我在每个fputs()之前都加一个if(! feof(fp))的判断,可以实现了,但是看着也是臃肿,不知道有没有简洁的方法
回复 8# dengxiayehu


   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
10 [报告]
发表于 2012-08-21 17:26 |只看该作者
这样行不?
  1.     while (!feof(fp1) && !feof(fp2)) {
  2.         if (fgets(line, MAX, fp1))
  3.             fputs(line, stdout);
  4.         if (fgets(line, MAX, fp2))
  5.             fputs(line, stdout);
  6.     }
  7.     while (!feof(fp1)) {
  8.         if (fgets(line, MAX, fp1))
  9.             fputs(line, stdout);
  10.     }
  11.     while (!feof(fp2)) {
  12.         if (fgets(line, MAX, fp2))
  13.             fputs(line, stdout);
  14.     }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP