2013-12-18 4 views
3

У меня есть 2 файла txt, где у меня есть номера> 0, и мне нужно их комбинировать и сортировать. Также не может быть двух одинаковых значений.Объединить 2 файла и отсортировать их

Вот значения файлов. File1:

1 
2 
3 
4 
5 
6 
7 

File2:

1 
3 
6 
8 
10 

Вывод должен выглядеть следующим образом:

1 
2 
3 
4 
5 
6 
7 
8 
10 

код, который я до сих пор:

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

int main() 
{ 
    FILE *fr1,*fr2; 
    int fst, snd, p[256], i=0, n=0; 
    bool f1=true,f2=true; 

    fr1 = fopen("txt/cisla.txt","r"); 
    fr2 = fopen("txt/cisla2.txt","r"); 

    while(feof(fr1) == 0 && feof(fr2) == 0) 
    { 

     if (f1) fscanf(fr1, "%d", &fst); 
     if (f2) fscanf(fr2, "%d", &snd); 

     printf("%d - %d\n", fst, snd); 

     if (fst == snd) 
     { 
      f1 = true; 
      f2 = true; 
      p[i] = fst; 
     } else if (fst > snd) 
     { 
      p[i] = snd; 
      f1 = false; 
      f2 = true; 
     } else 
     { 
      f2 = false; 
      f1 = true; 
      p[i] = fst; 
     } 

     i++; 

    } 

    fclose(fr1); 
    fclose(fr2); 

    printf("\n\n\n"); 

    for(int j = 0; j < i; j++) 
    { 
      printf("%d\n", p[j]); 
    } 

    return 0; 

} 

Результат это:

1 - 1 
2 - 3 
3 - 3 
4 - 6 
5 - 6 
6 - 6 
7 - 8 


1 
2 
3 
4 
5 
6 
7 

Нижняя часть - это массив. Вверху я пишу значения, которые читаются. Дело в том, что он, кажется, останавливается в конце первого файла, но я хочу, чтобы он продолжал второй, даже если первый находится в конце.

+0

Ваши файлы сортируются, не так ли? – dasblinkenlight

+0

да они отсортированы – DeiForm

+0

'system (" cat file1 file2> sort ");'? –

ответ

2

Дело в том, что, кажется, чтобы остановить в конце первого файла

это потому, что вы сказали ему сделать это - условие продолжения, что у вас есть то, что оба feof s вернулся к нулю:

while(feof(fr1) == 0 && feof(fr2) == 0) { 
    ... 
} 

Я хочу, чтобы продолжить вторую, даже если первый из них в конце

Добавьте еще две петли после того, как первый, чтобы написать «хвост» файла с крупными элементами:

while(feof(fr1) == 0 && feof(fr2) == 0) { 
    ... // Do the merge 
} 
while(feof(fr1) == 0) { 
    ... // Read from fr1, and write to the output 
} 
while(feof(fr2) == 0) { 
    ... // Read from fr2, and write to the output 
} 
+0

, если я изменю его на ИЛИ, он сработает и как я могу скопировать переменные, если я сделаю 2 разных цикла? – DeiForm

+0

@DeiForm Эти две «хвостовые» петли появляются после «цикла слияния». Я отредактировал ответ, чтобы проиллюстрировать. – dasblinkenlight

+0

хорошо, я все равно не понимаю, первый будет делать то же самое, что и сейчас, а затем что мне делать во 2-й петле? – DeiForm

0

Ваш цикл while говорит, чтобы продолжить, пока файлы BOTH не находятся в конце ; Я думаю, вы хотите, чтобы он продолжался до тех пор, пока ETERER не закончил. Конечно, лучше быть уверены, что не пытаться читать тот, который в конце концов ...

+0

Не могли бы вы быть более конкретными, из этого я думаю, что я должен изменить цикл while от AND до OR, но как я не могу прочитать из файла, который уже в конце? – DeiForm

+0

Внутри цикла вы можете проверить файл eof перед его чтением. –

0

Это небольшое улучшение может помочь.

while(feof(fr1) == 0 || feof(fr2) == 0) 
{} 

Это потому, что вы хотите зациклиться или прочитать, пока оба файла не будут полностью прочитаны.

Btw, почему вы не можете использовать некоторые общие контейнер ..

+0

это приведет к сбою, цикл никогда не закончится – DeiForm

+0

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

+0

, потому что я сменил его и попробовал его – DeiForm

0

Ваш вопрос помечается как C++, но код представлен не похож на него. Он больше походит на C.

Гораздо проще выполнить то, что вы пытаетесь сделать, если не избегать изобретать колесо и использовать стандартную библиотеку C++.

Вот простой пример того, как сделать это с помощью std::vector и стандартную библиотеку:

// Open file streams for reading. 
std::ifstream fr1{"file1.txt"}; 
std::ifstream fr2{"file2.txt"}; 

// Read number tokens into a std::vector from both files. 
std::vector<int> v{std::istream_iterator<int>{fr1}, std::istream_iterator<int>{}}; 
v.insert(std::begin(v), std::istream_iterator<int>{fr2}, std::istream_iterator<int>{}); 

// Sort the vector. 
std::sort(std::begin(v), std::end(v)); 

// Remove consecutive duplicates (move them to back of vector). 
auto end = std::unique(std::begin(v), std::end(v)); 

// Remove duplicate elements. 
if (end != std::end(v)) { 
    v.erase(end, std::end(v)); 
} 

// Output vector. 
for (int i : v) { 
    std::cout << i << std::endl; 
} 

Look at this live example

Смежные вопросы