| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 773 人关注过本帖
标题:如何在c程序里,读取两个文档疑问
取消只看楼主 加入收藏
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:8 
如何在c程序里,读取两个文档疑问
文档1:
程序代码:
124
235
152
178
156
142
178
163
159

文档2:
程序代码:
124|5623
452|6698
178|9995
235|7542
159|8852
152|9963
156|8512
885|9956
754|6523

理想输出文档结果:
程序代码:
124|5623
235|7542
152|9963
178|9995
156|8512
142|
178|9995
163|
159|8852

分析数据逻辑:
程序代码:
1. 理想输出文档结果,以文档1的内容为模板;若文档2有相同数据,印出其数据;若不,保留空白;
2.理想格式:
程序名称 文档1名称 文档2名称 理想输出文档结果

我写的awk code:
awk -F"|" ' NR == FNR { arr[$1]=$2; next } {  print $1"|"arr[$1] } '  文档2名称 文档1名称 > 理想输出文档结果

我的awk,若是当文档1和2,数据相近时,没有分析上的问题。
但若文档1和2过大,这会遇到无法读取文档的问题 :(
多谢各位的意见.
搜索更多相关主题的帖子: c程序 如何 color 
2011-07-11 17:00
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 2楼 pangding
你好,版主 :)
我要读取的文档,没有那么大..
两个文档,各别最多大约(~400Mb)罢了
2011-07-12 11:01
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 3楼 pangding
文档1的数据,有可能比文档2少...
但理想输出结果,一切介试文档1为模板...
数据里,是有可能文档2里有,而文档1没有的情况发生...
2011-07-12 11:03
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 6楼 succubus
谢谢你的回复,succubus :)
这是我用您的程序,得到的结果:
程序代码:
124|5623
142|
152|9963
156|8512
159|8852
163|
178|9995
235|7542

输入文档1中“178”出现了两次.
但以上的结果,只出现一次的“178”.
您有任何意见,可以让结果页面如文档1一样,出现两次的“178”?
谢谢 :)
2011-07-12 14:42
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 8楼 succubus
谢谢您,succubus.
您所写的c++程序,得到和理想结果一样的数据 :)
要好好消化和理解您所写的程序。
处理较大的文档时,也是很快
非常感谢你的分享噢。
2011-07-12 16:06
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 10楼 succubus
非常感谢您的无私分享 :)
我之前对awk,sed,perl及基本的unix command,比较熟悉。
我多数都是用综合以上的语言,来处理文档。
但最近发觉,在处理某些较大的文档(>1Gb),我会遇到该程序需要花费很长的时间处理文档及没有足够记忆(RAM)分析文档。
因此,才希望了解c语言,是如何分析相同的文档。
我会再详读您的每行code,希望能理解您所用的逻辑。
谢谢
2011-07-12 17:00
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 10楼 succubus
你好,我尝试篇写您的c程序,让其能自由读取任何输入的文档。
理想操作格式:
./cpp_program_name [input_file1_name] [input_file2_name] [output_file_name]

以下是我利用您的c程序,篇改的内容:
程序代码:
#include <stdio.h>
#include <string>
#include <map>
#include <fstream>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
       map<string, string> outMap;
       vector<string> keys;

       char buf[4096];
       FILE *fin1, *fin2, *fout;

       if(argc != 4)
       {
               fprintf(stderr, "Usage:  ./cpp_program_name [input_file1_name] [input_file2_name] [output_file_name]\n", argv[0]);
               return(1);
       }

       fin1=fopen(argv[1], "r");
       if(fin1 == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[1]);
              return(1);
       }
       fin2=fopen(argv[2], "r");
       if(fin2 == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[2]);
              return(1);
       }


       fout=fopen(argv[3], "w");
       if(fout == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[3]);
              return(1);
       }
    string key;
    string word;
    string line;
    int delimiterPos;
    map<string, string>::iterator searchRes;
    while(fgets(buf, 4096, fin1))
{
    while (fin1 >> key)
    {
        keys.push_back(key);
        outMap.insert(make_pair(key, "|"));
    }
}
    while(fgets(buf, 4096, fin2))
{
    while (fin2 >> line)
    {
        delimiterPos = line.find('|');
        key = line.substr(0, delimiterPos);
        word = line.substr(delimiterPos);
        if ((searchRes = outMap.find(key)) != outMap.end())
            searchRes->second = word;
    }
}
    for (vector<string>::iterator iter = keys.begin(); iter != keys.end(); ++iter)
    {
        searchRes = outMap.find(*iter);
        fout << searchRes->first << searchRes->second << endl;
    }
    fclose(fin1);
    fclose(fin2);
    fclose(fout);

    return 0;
}

当我试着解码以上程序时:
程序代码:
[home@cpp]g++ cpp_program.cpp
cpp_program.cpp: In function aint main(int, char**)a:
cpp_program.cpp:50: error: no match for aoperator>>a in afin1 >> keya
cpp_program.cpp:58: error: no match for aoperator>>a in afin2 >> linea
cpp_program.cpp:70: error: no match for aoperator<<a in afout << searchRes.std::_Rb_tree_iterator<_Tp>::operator-> [with _Tp = std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]()->std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::firsta

您是否知道,该如何篇改,才能让您的c程序,依照理想操作形式的格式,运行及分析文档?
理想操作格式:
./cpp_program_name [input_file1_name] [input_file2_name] [output_file_name]
2011-07-12 17:31
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 13楼 pangding
你好,以下三行,是错误的代码,我现在还在努力修正中
程序代码:
#include <stdio.h>
#include <string>
#include <map>
#include <fstream>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
       map<string, string> outMap;
       vector<string> keys;

       char buf[4096];
       FILE *fin1, *fin2, *fout;

       if(argc != 4)
       {
               fprintf(stderr, "Usage:  ./cpp_program_name [input_file1_name] [input_file2_name] [output_file_name]\n", argv[0]);
               return(1);
       }

       fin1=fopen(argv[1], "r");
       if(fin1 == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[1]);
              return(1);
       }
       fin2=fopen(argv[2], "r");
       if(fin2 == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[2]);
              return(1);
       }


       fout=fopen(argv[3], "w");
       if(fout == NULL)
       {
              fprintf(stderr, "Couldn't open %s\n", argv[3]);
              return(1);
       }
    string key;
    string word;
    string line;
    int delimiterPos;
    map<string, string>::iterator searchRes;
    while(fgets(buf, 4096, fin1))
{
    while (fin1 >> key)
    {
        keys.push_back(key);
        outMap.insert(make_pair(key, "|"));
    }
}
    while(fgets(buf, 4096, fin2))
{
    while (fin2 >> line)
    {
        delimiterPos = line.find('|');
        key = line.substr(0, delimiterPos);
        word = line.substr(delimiterPos);
        if ((searchRes = outMap.find(key)) != outMap.end())
            searchRes->second = word;
    }
}
    for (vector<string>::iterator iter = keys.begin(); iter != keys.end(); ++iter)
    {
        searchRes = outMap.find(*iter);
        fout << searchRes->first << searchRes->second << endl;
    }
    fclose(fin1);
    fclose(fin2);
    fclose(fout);

    return 0;
}
2011-07-13 19:27
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 14楼 succubus
谢谢你的细心帮忙和解释,我还在努力改正中
2011-07-13 19:28
快速回复:如何在c程序里,读取两个文档疑问
数据加载中...
 
   



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

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