合并2个文件并对其进行排序

时间:2013-12-18 18:03:42

标签: c++

我有2个txt文件,其中我有数字> 0,我必须对它们进行组合和排序。也不能有2个相同的值。

以下是文件的值。 文件1:

1
2
3
4
5
6
7

文件2:

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

底部是阵列。在顶部我写的是读取的值。事情是它似乎停在第一个文件的末尾,但我希望它继续第二个文件,即使第一个文件在结尾

4 个答案:

答案 0 :(得分:2)

  

事情似乎是在第一个文件的末尾停止了

那是因为你告诉它这样做 - 你所拥有的延续条件是两个feof都返回零:

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
}

答案 1 :(得分:0)

你的while循环说继续,而BOTH文件不在最后;我认为只要EITHER不在最后,你就希望它继续下去。当然,你最好不要试着从最后的那个读取......

答案 2 :(得分:0)

这一小改进可能会有所帮助。

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

这是因为您想要循环或读取,直到两个文件都没有被完全读取。

不过,为什么你不能使用一些通用的容器..

答案 3 :(得分: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