2014-02-26 108 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++ - >命令行 - >其他選項(文本上右下框)。

這應該可以解決問題!