2014-02-26 110 views
4

为了从一个文本文件中读取输入,我写了下面的代码:如何使用功能freopen_s

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中使用“流”。谢谢你回答我的问题。

+1

即使暂停是Windows特定的,你也没有正确拼写'pause',这可能是为什么它没有效果。 –

+0

你的代码适合我。 – jliv902

+0

**注意:**长期以来,我认为fopen_s()和等价物只是微软用来推动更多厂商锁定的无用东西。但它实际上与fopen()有一个关键区别:fopen()让任何其他进程根据需要访问文件,而fopen_s()根据模式设置共享(“r”允许其他读者,“w”专门打开) – Medinoc

回答

-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; 
} 
}  
+0

你需要检查text_filestream的有效性吗?如果文件不存在..? –

+0

@Digital_Reality我猜他为了简洁省略了错误检查(OP也没有错误检查)。你可以通过'std :: ifstream :: is_open()'和std :: ifstream :: good()'','std :: ifstream :: fail()'来检查文件是否成功打开, std :: ifstream :: eof()或者std :: ifstream :: bad(全部从std :: ios继承),这取决于你的需要。 –

+0

@MaxTruxa Soungs不错。谢谢! –

2

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

在VS,你可以通过下面的链接添加它 -

项目 - > “项目” 属性 - > C/C++ - >命令行 - >其他选项(文本上右下框)。

这应该可以解决问题!