2012-04-11 22 views
3

當使用ifstream的類來讀取從輸入文件中的單詞,我已經使用下面的表達式:差異使用克ifstream的++和MSVC

#include <iostream> 
#include <fstream> 

int main(int argc, char *argv[]) 
{ 
    std::ifstream inputStream(myFile.txt); 
    std::string myString; 
    myFile.open() 
    while(myFile.good()) 
    { 
     myFile >> myString; 
     printf("%s \n", myString); 
    } 
    return 0; 
} 

MYFILE.TXT的內容是: 「這是一個簡單的程序。「

編譯和執行按預期使用g ++編譯器。

但是,使用msvc 2008編譯時的相同代碼在提取操作符(>>)處返回錯誤,要求我用初始化的字符數組或任何受支持的本機類型替換std :: string。
因爲我期望標準庫的使用在各個實現中是相同的,所以這讓我感到不快。
我瞭解編譯錯誤,並知道如何使用c_str()修復它。

但是,如果有人能夠澄清爲什麼標準庫的使用在不同平臺上有所不同,這將對我有很大的幫助。
對我來說,它不再是星號!

編輯:代碼更新完成。 myFile.txt的內容已更新。

+0

什麼是'MYFILE:

while (myfile>>myString) std::cout << myString << " \n"; 

或者,你可以用一個標準的算法做的工作'?你還沒有定義一個。如果ot是'inputStream',後者沒有沒有參數的'open'。 – Lol4t0 2012-04-11 19:38:36

+0

@ Lol4t0代碼更新完成。另外,模式默認是ios_base :: in。參考:http://www.cplusplus.com/reference/iostream/ifstream/open/ – 2012-04-11 21:39:11

+0

@JerryCoffin:作出比答案,我已經被 – 2012-04-11 21:42:06

回答

4

有可能是您忘記了#include <string>。沒有它,微軟的版本<iostream>(包括這樣)包括足夠的一些std::string聲明工作,但其他部分丟失,所以你會得到奇怪的,看似莫名其妙的失敗。

其中一件丟失的事情是std::string的大部分運算符重載,這正是您似乎缺少的。

順便說一句,while (myfile.good()) ...是非常有保證的錯誤 - 你可能想:

#include <string> 
#include <algorithm> 
#include <iterator> 
#include <fstream> 
#include <iostream> 

int main() { 
    std::ifstream myfile("input.txt"); 

    std::copy(std::istream_iterator<std::string>(myfile), 
       std::istream_iterator<std::string>(), 
       std::ostream_iterator<std::string>(std::cout, " \n")); 
    return 0; 
} 
0

下編譯好,我於2010年MSVC:

std::ifstream inputStream; 
std::string myString; 
inputStream.open("myFile.txt", std::ifstream::in); 

while(inputStream.good()) 
{ 
    inputStream >> myString; 
}

注意:不使用std::ifstream::in爲我開的方式,我得到了同樣的錯誤,你。我建議你檢查你對這個參數有什麼價值。

+0

我相信剪輯不會編譯,因爲你不能在filescope上聲明語句(只有聲明)。你和@Vinshnu都沒有提供所有相關的代碼。 – 2012-04-11 20:47:32

+0

@LokiAstari代碼用輸入文件更新。 – 2012-04-11 21:40:04

+0

@Saul打開的方法默認爲ios_base :: in。 http://www.cplusplus.com/reference/iostream/ifstream/open/ – 2012-04-11 21:42:05