如何使用函数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的主要内容,如果未能解决你的问题,请参考以下文章