| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 623 人关注过本帖
标题:顺序打印两个文件内容有错
只看楼主 加入收藏
aneeg
Rank: 1
等 级:新手上路
帖 子:75
专家分:8
注 册:2014-4-10
结帖率:86.67%
收藏
已结贴  问题点数:15 回复次数:7 
顺序打印两个文件内容有错
程序代码:
/*编写一个程序,打开两个文件。使用命令行参数获得文件名,让程序打印第一个文件的第一行、第二文件的第二行、第一个文件的第二行、第二个文件的第二行,依次类推,直到打印完行数较多的文件最后一行。*/
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
    FILE *p1,*p2;//创建两个文件指针
    char str1[100],str2[100];//创建两个字符串数组
    if((p1=fopen(argv[1],"r"))==NULL){
        printf("Can't open %s",argv[1]);
        exit(1);//尝试打开文件1
    }
    if((p2=fopen(argv[2],"r"))==NULL){
        printf("Can't open %s",argv[2]);
        exit(1);//尝试打开文件2
    }
    while(1){
        fgets(str1,80,p1);
        fputs(str1,stdout);//打印文件1的内容
        fgets(str2,80,p2);
        fputs(str2,stdout);//打印文件2的内容
        if((fgets(str1,80,p1)) == NULL && (fgets(str2,80,p2))== NULL) break;//退出循环
    }
    fclose(p1);
    fclose(p2);//关闭文件
    return 0;
}
文件p1的内容是:
第一个文件第一行
第一个文件第二行
第一个文件第三行
第一个文件第四行

文件p2的内容是:
第二个文件第一行
第二个文件第二行
第二个文件第三行
第二个文件第四行

运行的结果是:
第一个文件第一行
第二个文件第一行
第一个文件第三行
第二个文件第二行
第一个文件第四行第二个文件第三行
第一个文件第四行第二个文件第四行

2014-05-04 10:22
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:15 
if((fgets(str1,80,p1)) == NULL && (fgets(str2,80,p2))== NULL) break;//退出循环
这里不光是退出循环条件,实际上这里各读取了一行,文件指针已经向后各移动了一行的位置,但是你没有打印出来。
while循环可以这样:
    while((fgets(str1,80,p1)) != NULL)
            fputs(str1,stdout);//打印文件1的内容
    while((fgets(str2,80,p2)) != NULL)
            fputs(str2,stdout);//打印文件2的内容



[ 本帖最后由 Andrew_Lee 于 2014-5-4 10:38 编辑 ]
2014-05-04 10:28
aneeg
Rank: 1
等 级:新手上路
帖 子:75
专家分:8
注 册:2014-4-10
收藏
得分:0 
回复 2 楼 Andrew_Lee
嗯,应该是这行的原因,可为什么第二个文件内容能全部显示
2014-05-04 10:37
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
回复 3 楼 aneeg
这是因为读取第三行的时候,这个fgets(str1,80,p1)) == NULL这个判断不成立,编译器就不会对对&&后面的部分进行计算了。所以在if中fgets(str2,80,p2))== NULL中的fgets一直就没有执行过。所以每次在while循环中都把2的内容读取出来了。
2014-05-04 10:45
aneeg
Rank: 1
等 级:新手上路
帖 子:75
专家分:8
注 册:2014-4-10
收藏
得分:0 
回复 2 楼 Andrew_Lee
你这样会分别打印两个文件的内容吧,不合题意啊
2014-05-04 10:46
aneeg
Rank: 1
等 级:新手上路
帖 子:75
专家分:8
注 册:2014-4-10
收藏
得分:0 
回复 4 楼 Andrew_Lee
这个懂了,一直以为&&是无论真假都要计算的
2014-05-04 10:48
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
回复 5 楼 aneeg
问题找到了,就应该很好改了吧。还用把代码都贴下来么
程序代码:
    while(1){
        if((fgets(str1,80,p1))!=NULL)
        fputs(str1,stdout);//打印文件1的内容
        if((fgets(str2,80,p2))!=NULL)
        fputs(str2,stdout);//打印文件2的内容
    }

2014-05-04 10:53
aneeg
Rank: 1
等 级:新手上路
帖 子:75
专家分:8
注 册:2014-4-10
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
    int ch;
    char str1[100],str2[100],*s1,*s2;
    FILE *p1,*p2;
    if(argc!=3){
        printf("无法执行命令");
        exit(EXIT_FAILURE);
    }
    if((p1=fopen(argv[1],"r"))==NULL){
        printf("Can't open ",argv[1]);
        exit(EXIT_FAILURE);
    }
    if((p2=fopen(argv[2],"r"))==NULL){
        printf("Can't open ",argv[2]);
        exit(EXIT_FAILURE);
    }
    while(1){
        if((s1=fgets(str1,100,p1))!=NULL)
        fputs(str1,stdout);
        if((s2=fgets(str2,100,p2))!=NULL)
        fputs(str2,stdout);
        if(s1==NULL && s2==NULL)
            break;
    }
    printf("\n运行成功");
    fclose(p1);
    fclose(p2);
    return 0;
}
修改了程序,还有另外一个问题,怎么在一个文件结尾处添加换行符。
一文件一行
二文件一行
一文件二行
二文件二行
一文八三行
二文八三行
一文件四行
二文件四行
一文件五行
二文件五行一文件六行
一文件七行
一文件八行
运行成功
2014-05-05 17:21
快速回复:顺序打印两个文件内容有错
数据加载中...
 
   



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

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