免费注册 查看新帖 |

Chinaunix

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

[C] 关于fgets()函数一次读取文件一行的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-17 11:30 |只看该作者 |倒序浏览
// Write a program that takes two command-line arguments. The first is a character, and the second is a filename. The program should print only those lines in the file containing the given character.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 257

int main(int argc,char *argv[])
{
        int ch;
        char line[MAX];
        FILE *fp;

        if(argc==3)
        {
                ch=atoi(argv[1]);
                if((fp=fopen(argv[2],"rt"))==NULL)
                {
                        fprintf(stderr,"Can't not open the file %s.\n",argv[2]);
                        exit(1);
                }
                while(fgets(line,MAX-1,fp)!=NULL)
                            if(strchr(line,ch))
                                puts(line);
        }
        else
                fprintf(stderr,"Usage: %s character filename.\n",argv[0]);

        return 0;
}
这个是《c prime plus》函数上面的一个题目,就是从命令行输入一个字符和一个文件,然后打印文件中包含给定字符的行
程序没有达到预期的效果,我感觉应该是        fgets(line,MAX-1,fp) 这句的问题,求指点?

论坛徽章:
0
2 [报告]
发表于 2012-08-17 12:46 |只看该作者
  1.                while(fgets(line,MAX-1,fp)!=NULL)
  2.                             if(strchr(line,ch))
  3.                                 puts(line);
复制代码
fputs/fgets,puts/gets两组函数不要混用
fgets函数遇到换行符时会将其读进缓冲区中,而gets会将其抛弃,在puts的时候自动在字符串后添加一个换行符

论坛徽章:
0
3 [报告]
发表于 2012-08-17 13:09 |只看该作者
回复 1# xiaowh00
源码中 定义的字符是int型  刚才却百度上面查了一下 strchr函数 也好像确实有参数是int的情况 这个时候我比较好奇的是strchr是用什么算法来进行查找的
你的文本文件中存储的肯定是ASCII码 对应的是字符 而你要查找的是int型  对应是四字节数据 当然可以把该int按照4个char来进行检索 这个时候查找的就是子字符串了
楼上的fputs和puts匹配问题 我试过了 起不了作用 我认为重点不在这上面



   

论坛徽章:
0
4 [报告]
发表于 2012-08-17 13:22 |只看该作者
回复 1# xiaowh00
我认为你使用的strchr并不是你要所要用的 因为你判断的是字符 使用此原型 char * strchr(char *buf, char ch);

把你的ch变量定义为char 然后在if(arg===3)里面 使用 ch=argv[1][0]来从argv[1]这个指针里面来取它的第一个字符 然后把fputs写到文件中去 或者fputs(line, stdout)写到标准输出

已测试 代码可实现该功能 有问题再反馈


   

论坛徽章:
0
5 [报告]
发表于 2012-08-17 13:48 |只看该作者
一语点醒啊,谢谢,不过楼上也指出了一个关于换行的问题,按照你们两位指出的,我做了修改,应该是基本完成了功能。谢谢两位哈。。。

// Write a program that takes two command-line arguments. The first is a character, and the second is a filename. The program should print only those lines in the file containing the given character.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 257

int main(int argc,char *argv[])
{
        char ch;
        char line[MAX];
        FILE *fp;

        if(argc==3)
        {
                ch=argv[1][0];
                if((fp=fopen(argv[2],"rt"))==NULL)
                {
                        fprintf(stderr,"Can't not open the file %s.\n",argv[2]);
                        exit(1);
                }
                while(fgets(line,MAX,fp)!=NULL)
                {
                        line[strlen(line)-1]='\0';
                            if(strchr(line,ch))
                                puts(line);
                }
        }
        else
                fprintf(stderr,"Usage: %s character filename.\n",argv[0]);

        return 0;
}

回复 3# liuyang7078
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP