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);
- 你不应该在 C++ 中使用 malloc,因为它只分配内存而不构造对象。你应该只使用
new
甚至 new
也应该非常小心地使用
- 动态分配向量没有意义。向量是一个容器,负责动态分配它将包含的对象
- 除非有特殊情况,否则应避免在 C++ 中使用原始指针。返回指向动态分配对象的指针是一种代码味道。
这还不是全部。向量是可变大小的数组。当你有一个编译时间常量大小时,你应该使用 std::array
.
换句话说,您当前的代码一直使用错误的容器:原始数组或指针,您应该使用向量,而向量您应该使用 std::array
。
这段代码实在是太糟糕了,我无法理解你想要做什么并帮助你修复它。请在新问题中用可接受的 C++ 编写。
我不想在这里冒犯。我只是想建议你学习好的做法,因为如果你想学习C++,它真的很重要。
我在做一道编程题并使用 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);
- 你不应该在 C++ 中使用 malloc,因为它只分配内存而不构造对象。你应该只使用
new
甚至new
也应该非常小心地使用 - 动态分配向量没有意义。向量是一个容器,负责动态分配它将包含的对象
- 除非有特殊情况,否则应避免在 C++ 中使用原始指针。返回指向动态分配对象的指针是一种代码味道。
这还不是全部。向量是可变大小的数组。当你有一个编译时间常量大小时,你应该使用 std::array
.
换句话说,您当前的代码一直使用错误的容器:原始数组或指针,您应该使用向量,而向量您应该使用 std::array
。
这段代码实在是太糟糕了,我无法理解你想要做什么并帮助你修复它。请在新问题中用可接受的 C++ 编写。
我不想在这里冒犯。我只是想建议你学习好的做法,因为如果你想学习C++,它真的很重要。