标题:高人们来解答下。C读入和输出中文的问题。
只看楼主
莫桑比克
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-8-2
结帖率:20%
已结贴  问题点数:10 回复次数:22 
高人们来解答下。C读入和输出中文的问题。
问题是这样的。
读入1.txt和2.txt两个文件的中文数据正行对比是否一样。一样的缔代为“本条数据相同的以删除”
   1.txt的内容如下:

爆笑图文剧:大众脸也有春天
开8中外电影里的黑道帮派们
单身小伙遭遇漂亮少妇女房东
潜规则:《西游记》未解之谜
拍芜湖国电领导歇斯底里咆哮
痛!准妈生命中不能承受之重
颐庐,民国的爱恨都已倾城
新婚姻法下女人如何保护自己
大学黑白,一点借鉴一点思考
“苹果之父”乔布斯的惊叹号
看上一妹子,怎一个荡字了得
新手竟想单人带幼儿长途自驾
八招教你保护牙齿健康
通胀,穷学生跪求省钱攻略

  2.txt的内容如下:

西游记
借鉴
保护
等好多关键字


还有就是请高手用二讲制读入比较是如何写的。每句带注释写来。
帮解答下以下;
中文存放到数组是以什么方式存放的。是字编码还是数值。又是以何方式解释出来的。
搜索更多相关主题的帖子: 大众 大学 乔布斯 西游记 歇斯底里 
2011-08-26 12:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你学到哪了?

授人以渔,不授人以鱼。
2011-08-26 12:51
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
得分:5 
我试着做了下,如果要把修改后内容还是写回1.txt的话,难度较大,要考虑的问题较多,这样写的话程序会很复杂,我觉得做到这一点不是程序的主要目的,所以我就降低了难度,把修改后的内容写到新建的3.txt文件里,这样把问题简化了不少,而且效率也高。没有经过几M文件的测试,就是测了下楼主所提供的文件,还是测试没有问题的。平台是GCC,代码如下:
程序代码:
#include "unp.h"

#define FILE1          "./1.txt"
#define FILE2          "./2.txt"
#define FILE3          "./3.txt"
#define MAXDATASIZE    1024
#define TRUE           1

typedef struct
{
    int length;
    char mark;
    char keyword[20];
}FILE_COMPAREINFO;         //保存每个关键字的信息,有长度、首字符、保存关键字的字符数组

int main(int argc,char **argv)
{
    int filelen;
    int readtry,readrest;
    FILE_COMPAREINFO keywordinfo[MAXDATASIZE];
    char readbuff[MAXDATASIZE];
    char writebuff[MAXDATASIZE];
    char writedata[] = "本条数据相同的以删除";
    int file1_fd;
    FILE *file2_fd;
    off_t set;
    int file_fd;
    int readbyte;
    int i,j;
    int infonum;
    int lastoffset;
    char *ptr;
    for(i = 0;i < MAXDATASIZE;i ++)                    //初始化长度
    {
        keywordinfo[i].length = 0;
    }

    file_fd = creat(FILE3,O_RDWR);                     //创建文件3.txt
    if((file1_fd = open(FILE1,O_RDWR)) < 0)           //打开文件1.txt
    {
        printf("open file1 failure or this file is not exist\n");
        exit(1);
    }
    filelen = lseek(file1_fd,0,SEEK_END);              //调用函数lseek求文件1.txt的长度
    readtry = filelen / MAXDATASIZE;                   //因为文件较大的话,每次处理1024个字节,需要处理readtry次
    readrest = filelen % MAXDATASIZE;                  //最后一次处理的字节数为readrest
    lseek(file1_fd,0,SEEK_SET);
    if((file2_fd = fopen(FILE2,"r")) < 0)             //打开文件2.txt的IO流
    {
        printf("open file2 failure or this file is not exist\n");
        exit(1);
    }
    i = 0;
    set = ftello(file2_fd);
    fseeko(file2_fd,set,SEEK_SET);
    while(fgets(keywordinfo[i].keyword,20,file2_fd) != NULL) //每次读一行,假设文件2.txt里的每一个关键字占一行
    {
        keywordinfo[i].mark = keywordinfo[i].keyword[0];
        ptr = &keywordinfo[i].keyword[0];
        while(*ptr != 0)
        {
            keywordinfo[i].length ++;
            ptr ++;
        }
        keywordinfo[i].length -= 2;
        i ++;
        set = ftello(file2_fd);
        fseeko(file2_fd,set,SEEK_SET);
    }
    infonum = i;
    lastoffset = 0;
    while(readtry --)                                   //每次处理1024个字节,处理readtry次
    {
        readbyte = read(file1_fd,readbuff,MAXDATASIZE);
        for(i = 0;i < readbyte;i ++)
        {
            for(j = 0;j < infonum;j ++)
            {
                if(readbuff[i] == keywordinfo[j].mark)
                {
                    if(!memcmp(&readbuff[i],keywordinfo[j].keyword,keywordinfo[j].length)) //比较文件1.txt的某一个字符串是否和关键字相同
                    {
                        file_fd = open(FILE3,O_RDWR | O_APPEND);
                        write(file_fd,&readbuff[lastoffset],i - lastoffset);
                        write(file_fd,writedata,strlen(writedata));
                        lastoffset = i + keywordinfo[j].length;
                    }
                }
            }
        }
        write(file_fd,&readbuff[lastoffset],i - lastoffset);         //之所以写这条语句,是和我的算法有关的,因为每次往文件3.txt里写都是在出现了
                                                                     //关键字后驱动的,所以最后末尾会出现还有一串没有关键字的数据,所以要单独写
    } 
    if(readrest > 0)                                      //处理最后的readrest个字节,除了字节数不一样之外,其他的和上一个循环的处理方法一样
    {
        bzero(readbuff,MAXDATASIZE);
        readbyte = read(file1_fd,readbuff,readrest);
        for(i = 0;i < readbyte;i ++)
        {
            for(j = 0;j < infonum;j ++)
            {
                if(readbuff[i] == keywordinfo[j].mark)
                {
                    if(!memcmp(&readbuff[i],keywordinfo[j].keyword,keywordinfo[j].length))
                    {
                        file_fd = open(FILE3,O_RDWR | O_APPEND);
                        write(file_fd,&readbuff[lastoffset],i - lastoffset);
                        write(file_fd,writedata,strlen(writedata));
                        lastoffset = i + keywordinfo[j].length;
                    }
                }
            }
        }
    }
    write(file_fd,&readbuff[lastoffset],i - lastoffset);
    printf("check over,please open file2 to see the result\n");
    return;
}


unp.h文件是我自己常用的.h文件,目的就是引入一些库文件,没有其他作用,在此我就不把这个文件的内容贴出来了。如果有人感兴趣的话,我再贴吧。希望能对楼主有用,

[ 本帖最后由 luyi_footman 于 2011-8-26 19:41 编辑 ]

天道酬勤!
2011-08-26 17:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
估计楼主这个东西是用来做敏感词过滤的。

授人以渔,不授人以鱼。
2011-08-26 17:06
莫桑比克
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-8-2
得分:0 
呵呵。这都让你猜出来了。
2011-08-26 18:35
莫桑比克
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-8-2
得分:0 
回复 3楼 luyi_footman
那你能再回答一下其他的的问题吗。
2011-08-26 18:37
莫桑比克
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-8-2
得分:0 
回复 3楼 luyi_footman
那你能再回答一下其他的的问题吗。
2011-08-26 18:37
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
得分:0 
一个字符是一个字节,一个汉字是两个字节,所以要如果想用一个字符数组存汉字的话,就需要两个数组元素来存一个汉字。至于这一个字以什么形式分成两个字节来存,就不清楚了,因为打印出来的话是乱码,如果确实想打印出汉字的话,需要涉及到ANSI编码与unicode的编码的转换,你可以网上找下相关知识。
其实我程序就是最好的解释,只是因为时间关系,没来得及加上注释,如果楼主确实需要的话,我可以再编辑一个注释版本给你。

天道酬勤!
2011-08-26 19:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
Unicode码就是两字节整数,这个两字节整数被定义为wchar_t数据类型,也可叫WORD,只要你构造的数组,每个元素是两字节的无符号整数即可。如果用ansi编码,单字符是一字节的整数,只要把两个字符连在一起输出,就看到汉字,不是乱码——前提是你不要把汉字的后半个字符与下一个汉字的前半个字符当成一个汉字——也就是说,此时你必须自己搞清楚汉字从哪个字节开始,特别是汉字与ascii单字符混合在一起的时候。

授人以渔,不授人以鱼。
2011-08-26 19:42
luyi_footman
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:100
注 册:2011-7-14
得分:0 
回复 9楼 TonyDeng
楼上正解。

天道酬勤!
2011-08-26 19:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-348460-1-1.html




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

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