2012-04-11 76 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