在 g++ 和 msvc 中使用 ifstream 读取文件的差异

Differences in reading file using ifstream in g++ and msvc

本文关键字:文件 读取 ifstream g++ msvc      更新时间:2023-10-16

当使用 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()修复它的方法。

但是,如果有人能澄清为什么标准库的用法在不同平台上是不同的,这将对我有很大帮助。
对我来说,它不再是斯塔达德了!

编辑:代码更新为完整。我的文件内容.txt更新。

很可能

你忘了#include <string>.没有它,Microsoft版本的<iostream>(等等)包含了足够的std::string声明,让某些事情正常工作,但其他部分缺失,所以你会得到奇怪的、看似莫名其妙的失败。

缺少的一件事是大多数运算符重载std::string,这正是您似乎缺少的。

顺便说一句,while (myfile.good()) ...几乎是一个有保证的错误 - 你可能想要:

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;
}
以下内容在

MSVC 2010 上对我来说编译得很好:

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

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