如何使用函数freopen_s

Posted

技术标签:

【中文标题】如何使用函数freopen_s【英文标题】:How to use function freopen_s 【发布时间】:2014-02-26 16:47:14 【问题描述】:

为了从文本文件中读取输入,我编写了以下代码:

int main()
    int x;
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    scanf("%d", &x);
    printf("%d\n", x);
    system("pause");
    return 0;

效果很好。

但是,在 Visual Studio 中,由于 freopen,编译器给了我一个错误,并建议我改用 freopen_s。我试图了解函数 freopen_s 的工作原理,但我不能。我的代码:

int main()
    int x;
#ifndef ONLINE_JUDGE
    FILE *stream;
    freopen_s(&stream, "input.txt", "r", stdin);
#endif
    scanf("%d", &x);
    printf("%d\n", x);
    system("pause");
    return 0;

它不输出任何东西,甚至“暂停”也不起作用。程序完成后 cmd 立即消失,没有打印任何内容。我不知道为什么在 freopen_s 中使用“流”。谢谢你回答我的问题。

【问题讨论】:

即使暂停是特定于 Windows 的,但您没有正确拼写 pause,所以这可能是它没有效果的原因。 你的代码对我有用。 注意: 长期以来,我认为 fopen_s() 和等价物只是微软用来推动更多供应商锁定的无用东西。但它实际上与 fopen() 有一个关键区别:fopen() 允许任何其他进程根据需要访问文件,而 fopen_s() 根据模式设置共享(“r”允许其他读者,“w”独占打开) 您可以将freopen("con","r",stdin); 放在system("pause") 之前作为快速破解,但这种“解决方案”很糟糕(将来可能会以意想不到的方式中断)。 @user694733 你是对的。回滚。泰。 【参考方案1】:

我会给你另一种方法。 如果你仍然想使用 freopen,你可以使用 “-D _CRT_SECURE_NO_WARNINGS”这个选项配合终端命令,错误信息会被抑制。

在VS中你可以在下面的链接下添加-

项目->“项目”属性->C/C++->命令行->附加选项(右下角的文本框)。

这应该可以解决问题!

【讨论】:

【参考方案2】:

我建议您避免使用 C 风格的 I/O 库并使用 iosTREAM 库。其更安全、更清洁的解决方案。这是打开文件并将每一行读入“std::string”对象并在控制台上打印的示例代码。

int main() 


std::string  file =  "input.txt";
std::string line;
std::ifstream  text_filestream(file.c_str());

while(std::getline(text_filestream, line)) 
 std::cout<<line<<std::endl;
 
    

【讨论】:

是否需要检查 text_filestream 的有效性?如果文件不存在怎么办..? @Digital_Reality 我猜他为了简洁而省略了错误检查(OP也没有错误检查)。您可以根据需要通过std::ifstream::is_open()查看文件是否打开成功,通过std::ifstream::good()std::ifstream::fail()std::ifstream::eof()std::ifstream::bad(均继承自std::ios)查看流状态。

以上是关于如何使用函数freopen_s的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的程序插入 MFC 对话框?

文件输入输出重定向

在应用程序中加一个控制台

C语言中,freopen,studin,studout有啥用

如何如何使用MOD函数?

c函数指针和指针函数如何使用何定义;如何调用使用