分类
未分类

分享 c 中重定向输入输出流到文件的简单方法

对于经常去刷 ACM 以及其他各种算法题的同学们来说,有时候需要许多的测试用例来验证是否会被 AC,但每次手动输入大量测试用例、调试又是极为麻烦的,本文分享一个比较简单的将标准输入输出流重定向到文件中的方法,是借助 freopen 函数。

freopen 原型函数声明于 stdio.h文件中,原型为:

FILE* freopen(char const* _FileName,char const* _Mode,FILE* _Stream);

其中,filename 是需要重定向到的文件名,mode 为文件访问权限字符串,比如 “w” 为写权限, “r” 为读权限,stream 为需要被重定向的文件流。先上一下简单的示例代码:

int main()
{
    int x, y;
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    scanf_s("%d,%d", &x, &y);
    printf("%d,%d\n", x, y);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

freopen(“in.txt”, “r”, stdin) 就是将 stdin(标准输入流)重定向到工作目录下 in.txt 文件中,之后的 scanf 操作实际上是从 事先准备好的 in.txt 中读取的。 同时将重定向标准输出流 stdout 到 out.txt 文件中 。

假如 in.txt 文件内容为 30,20 ,运行完代码后,控制台不会有输出,30,20\n 将会写入 out.txt 文件中。这样,就可以将较长的测试用例输入一次性写在文件里,方便调试程序了。

在大多数比较流行的的 c 编译器版本中,freopen 的使用会有警告导致编译无法通过,在 Visual Studio 中,下列解决方法:

  1. 使用 #pragma warning(disable:4996) disable 掉
  2. 在项目 –> 属性 –> C++ –> 预处理器 的预处理器定义中添加 _CRT_SECURE_NO_WARNINGS
  3. 使用 freopen_s 函数

freopen_s 是 freopen 的安全版本,原型为:

errno_t freopen_s(FILE** _Stream, char const* _FileName, char const* _Mode, FILE* _OldStream);

相比而言,比 freopen 多了一个输入参数,返回值为是否重定向成功的标志变量。

int main()
{
    int x, y;
    FILE* inFile, *outFile;
    freopen_s(&inFile, "in.txt", "r", stdin);
    freopen_s(&outFile, "out.txt", "w", stdout);
    scanf_s("%d,%d", &x, &y);
    printf("%d,%d\n", x, y);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注