Freopen 在函数调用后不写入输出

Freopen not writing output after a function call

我在做一道编程题并使用 freopen 重定向流。我面临的问题是 printf 命令 在 stdout 重定向 后不在输出文件上打印。我什至尝试使用 fflush 但无法得到任何结果。

这是我的代码

    #include<iostream>
    #include<vector>
    #include<cmath>
    #define fc(a) static_cast<float>(a)
    using namespace std;
    
    vector<int>* touch(const vector<int> arr[], int size)
    {
        vector<int>* touch_circles = (vector<int>*)malloc(sizeof(vector<int>)*size);
        int i1, i2, dis;
        for(i1 = 0; i1 < size; i1++)
        for(i2 = i1+ 1; i2 < size; i2++)
        {
            dis = static_cast<int>(ceil(pow(pow(fc(arr[i1][0]) - fc(arr[i2][0]),2) + pow(fc(arr[i1][1]) - fc(arr[i2][1]),2),0.5)));
            if (dis <= arr[i1][2] + arr[i2][2])
            {
                touch_circles[i1].push_back(i2);
                touch_circles[i2].push_back(i1);
            }
        }
        return touch_circles;
    }
    
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("D:\C++\input.txt","r",stdin);
        freopen("D:\C++\output.txt","w",stdout);
        freopen("D:\C++\output.txt","w",stderr);
        #endif
        int t, x, y, n;
        int itr, i, i1, i2;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d %d", &x, &y, &n);
            vector<int> arr[n];
            for(itr = 0; itr < n; itr++)
            {
                scanf("%d %d %d", &i1, &i2, &i);
                arr[itr].push_back(i1);
                arr[itr].push_back(i2);
                arr[itr].push_back(i);
            }

            //The 'fflush'es are just for trial, problem persists with or without any of them
            fflush(stdout);
            vector<int> *touch_list = touch(arr, n);
            fflush(stdout);
            printf("Expected");
            fflush(stdout);
        }
    }

这是我的input.txt

1
20 10
2
10 7 2
10 4 2

我的ouput.txt是空的。代码编译良好并且没有错误,它只是运行并完成而没有在输出文件上打印任何内容。 一件奇怪的事情是,如果我注释掉来自 main 的函数调用,输出会打印在 ouput.txt 上。 我不明白为什么会这样,因为我不认为那里是函数内部可能影响文件流的任何内容。感谢任何帮助,我现在完全没有想法!

像您这样的代码会生成指向未初始化内存的指针,并将其转换为向量指针:

vector<int>* touch_circles = (vector<int>*)malloc(sizeof(vector<int>*)*size);

这只是使用此类向量的未定义行为,而且分配的内存可能不足。它可能会使您的程序崩溃或挂起,并且不会产生任何输出。不要像那样在 C++ 代码中使用 malloc。如果你需要原始向量数组,那么写:

vector<int>* touch_circles = new vector<int>[size];

或者最好有向量的向量。

免责声明:这可能不是真正的答案,当然也不是预期的答案。但这是我在这里能做的最多的了,不适合发表评论...


是时候找到一个很好的 C++ 教程了...

这条指令很糟糕:

    vector<int>* touch_circles = (vector<int>*)malloc(sizeof(vector<int>)*size);
  1. 你不应该在 C++ 中使用 malloc,因为它只分配内存而不构造对象。你应该只使用 new 甚至 new 也应该非常小心地使用
  2. 动态分配向量没有意义。向量是一个容器,负责动态分配它将包含的对象
  3. 除非有特殊情况,否则应避免在 C++ 中使用原始指针。返回指向动态分配对象的指针是一种代码味道。

这还不是全部。向量是可变大小的数组。当你有一个编译时间常量大小时,你应该使用 std::array.

换句话说,您当前的代码一直使用错误的容器:原始数组或指针,您应该使用向量,而向量您应该使用 std::array

这段代码实在是太糟糕了,我无法理解你想要做什么并帮助你修复它。请在新问题中用可接受的 C++ 编写。

我不想在这里冒犯。我只是想建议你学习好的做法,因为如果你想学习C++,它真的很重要。