2015-12-29 6 views
0

Я новичок в C/C++ .I имеют 2 текстовые файлы и нужно объединить два файла содержимогоC++ объединить два файла вывода

Я исполненные как этот g++ merge.cc -o merge и создали два текстовых файла с содержимым, как это:

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

затем excuted эту команду: ./merge 10 t1.txt t2.txt Out пришел: 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; 
} 

могли бы вы кто explai n об этом. Я thave для сортировки файлов и вывода резерва с помощью -c, -r команды

Заранее спасибо

+0

ли ваши входные файлы содержат цифры или буквы? Если вы хотите сортировать комбинированные данные, я полагаю, что это файлы с номерами ... я правда? – VolAnd

+2

Это 'C' или' C++ '? Не может быть и то, и другое! – CinCout

+0

Да. Я имею только цифры. а не символы. Это язык C++ – Piraba

ответ

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).

Но в случае, когда оба входных файла уже упорядочены (отсортированы), программа может быть проще, но вам нужно открыть оба файла и сравнить значения во время чтения, чтобы вывести наименьшее значение из двух «текущих», и вам не нужен буфер массив для этого случая (это просто подсказка, попробуйте написать программу самостоятельно).

EDIT:

Это C++ пример с merge и sort из <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] - это имя первого файла, а argv[2] - это имя второго (добавьте соответствующую проверку самостоятельно).

3

В стандартной библиотеке C++ есть std::merge, чтобы сделать именно то, что вам кажется здесь. В основном откройте файлы, затем выполните слияние от пары istream_iterator s до ostream_iterator.

0

Следующий C++ пример показывает использование istream_iterator и ostream_iterator с merge методом:

#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; 
} 
Смежные вопросы