使用g++和msvc读取文件的ifstream有什么区别?

3
使用 ifstream 类从输入文件中读取单词时,我已经使用了以下表达式:
 #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内容已更新。


myFile是什么?你还没有定义它。如果它是inputStream,那么后者没有不带参数的open方法。 - Lol4t0
@Lol4t0 代码已更新完整。此外,默认情况下模式为ios_base :: in。参考链接:http://www.cplusplus.com/reference/iostream/ifstream/open/ - Vishnu Pedireddi
@JerryCoffin:把那作为答案吧,我以前也被这个问题困扰过。 - Mooing Duck
@JerryCoffin您的修复方法有效。需要在头文件中包含#include <string>。 - Vishnu Pedireddi
2个回答

4

很可能是您忘记了 #include <string>。 没有这个头文件,Microsoft的版本<iostream>(等等)包含足够的声明,使一些功能工作,但其他部分缺失,因此会出现奇怪,看似难以解释的失败。

其中缺失的部分包括 std::string 的大部分运算符重载,这恰好是您似乎缺少的。

顺便说一句,while (myfile.good()) ... 几乎是一个已知的 bug -- 您可能需要:

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

或者,您可以使用标准算法完成该工作:

#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

以下代码在我的MSVC 2010上编译正常:

std::ifstream inputStream;
std::string myString;
inputStream.open("myFile.txt", std::ifstream::in);
while(inputStream.good()) { inputStream >> myString; }

注意:如果不使用std::ifstream::in作为打开模式,我会得到与您相同的错误。建议您检查此参数的值。


我确信这段代码无法编译,因为你不能在文件作用域中使用语句(只能使用声明)。你和@Vinshnu都没有提供所有相关的代码。 - Martin York
@Saul open方法默认为ios_base :: in。http://www.cplusplus.com/reference/iostream/ifstream/open/ - Vishnu Pedireddi
@LokiAstari 这是在main()函数中的,抱歉给你带来困惑。 - Saul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接