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 的内容已更新。

4

2 回答 2

4

您可能忘记了#include <string>。没有它,Microsoft 的版本<iostream>(等等)包含足够的声明以std::string使某些事情正常工作,但缺少其他部分,因此您会遇到奇怪的、看似莫名其妙的失败。

缺少的一件事是大多数运算符重载 for 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;
}
于 2012-04-11T21:47:46.307 回答
0

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

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

同时(输入流。好())
{
    输入流>>我的字符串;
}

注意:没有使用std::ifstream::in我的打开模式,我得到了和你一样的错误。我建议您检查此参数的值。

于 2012-04-11T19:44:53.153 回答