C ++结合了两个文件输出

时间:2015-12-29 06:20:35

标签: c++ linux

我是C / C ++的新手。我有2个文本文件,需要合并两个文件内容

我执行了这样的g++ merge.cc -o merge并创建了两个文本文件,内容如下:

file1 : 1 3 5 7
file2 : 2 4 6 8

然后执行了这个命令:./merge 10 t1.txt t2.txt 出来了:1 2 3 4 5 6 7 81 2 3 4 5 6 7 8

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

void combine(char s[], char t[], char result[]);

int main(int argc, char* argv[])
{      
    const int MAX = 20;
    char inBuffer1[MAX];
    char inBuffer2[MAX];
    char outBuffer[MAX*2];

    int max = atoi(argv[1]);
    ifstream file1(argv[2]);
    ifstream file2(argv[3]);

    file1.getline(inBuffer1,max);
    file2.getline(inBuffer2,max);

    combine (inBuffer1, inBuffer2, outBuffer);
    cout << outBuffer << endl;
}


void combine(char s[], char t[], char result[])
{
    int i, j, k;

    for (i = j = k = 0; s[i] && t[j]; k++)
    {
        if (s[i] <= t[j])
            result[k] = s[i++];
        else
            result[k] = t[j++];
        cout << result[k];
    }

    //tidy up
    for (; s[i]; )
    {
        result[k] = s[i++];
        cout << result[k++];
    }
    for (; t[j]; )
    {
        result[k] = t[j++];
        cout << result[k++];
    }
    result[k] = 0;
}

你能不能解释一下这个问题。我希望使用-c,-r命令

对文件进行排序并保留输出

提前致谢

3 个答案:

答案 0 :(得分:3)

c ++标准库有std::merge来完成你在这里想要的东西。基本上打开文件,然后从几个istream_iteratorostream_iterator进行合并。

答案 1 :(得分:1)

尝试以下C程序示例(没有combine函数):

#include <stdio.h>
#include <stdlib.h>

// compare function to sort int values
int comparator(const void *p, const void *q) 
{
    int l = *(int*)p;
    int r = *(int*)q; 
    return (l - r);
}

int main(int argc, char* argv[])
{      
    const int MAX = 20;
    int buffer[MAX*2];
    int cnt = 0; // numbers in buffer
    // check arguments
    if( argc < 3)
    {
        printf("Provide correct arguments: one number and two files with numbers\n");
        return 1;
    }

    // reading from 2 files in series
    FILE * f;
    for(int i = 2; i <= 3; i++)
    {
        f = fopen(argv[i], "r");
        if( f == NULL )
        {
            printf("File %s cannot be read!\n", argv[2]);
            break;
        }
        while( !feof(f) && cnt < MAX*2 ) // while file is not finished and array is not full
        {
            if( fscanf(f, "%d", &buffer[cnt]) ) // read data
                cnt++; // and if reading is successful count
        }
        fclose(f);
    }

    // sort the resulting array (instead of combine function)
    qsort(buffer, cnt , sizeof(int), comparator);

    // printing results
    for( int i = 0; i < cnt; i++)
    {
        printf("%d ", buffer[i]);
    }
}

此示例适用于初始文件不包含有序值的情况,因此两个文件中的所有值都将读取到内存中,然后按stdlib.h中的标准函数进行排序(使用我们需要的qsort函数comparator,请在references中阅读更多内容。

但是对于两个输入文件已经安排(排序)的情况,程序可以更简单,但是你需要打开两个文件并在读取时比较值以输出两个&#34;当前&#34;中的最小值,然后你对于那种情况不需要缓冲区数组(这只是一个提示,尝试自己编写程序)。

修改

来自merge的{​​{1}}和sort是C ++示例:

<algorithm>

注意:在此示例中,您无需向用户询问数据序列的大小,因此#include <iostream> #include <fstream> #include <algorithm> #include <functional> #include <vector> using namespace std; int main(int argc, char* argv[]) { int data; // buffer to read one value from file ifstream file1(argv[1]); ifstream file2(argv[2]); vector<int> v1, v2; // vectors to store data // reading initial data to vectors while( !file1.eof() ) { file1 >> data; v1.push_back(data); } file1.close(); while( !file2.eof() ) { file2 >> data; v2.push_back(data); } file2.close(); // sorting (essential if files are not sorted) sort(v1.begin(), v1.end(), less <int>()); sort(v2.begin(), v2.end(), less <int>()); // marging vector<int> res(v1.size() + v2.size()); // vector to store result merge(v1.begin(), v1.end(), v2.begin(), v2.end(), res.begin(), less <int>()); // printing result for(vector<int>::iterator i = res.begin(); i != res.end(); i++) { cout << *i << " "; } } 是第一个文件的名称,argv[1]是名称第二个(自己添加适当的检查)。

答案 2 :(得分:0)

以下C ++示例显示了使用istream_iterator方法的ostream_iteratormerge的用法:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
using namespace std;

int main(int argc, char* argv[])
{      
    // open input files
    ifstream file1(argv[1]);
    ifstream file2(argv[2]);
    // link input streams with files
    istream_iterator<int> it1(file1);
    istream_iterator<int> it2(file2);
    istream_iterator<int> eos;  // end-of-stream iterator

    // link output stream to standard output
    ostream_iterator<int> oit (cout," "); // " " = usage of space as separator

    // marging to output stream
    merge(it1, eos, it2, eos, oit);

    file1.close();
    file2.close();
    return 0;
}