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れていますが、他の部分が欠落しているため、奇妙な、一見説明のつかない失敗が発生します。

不足しているものの 1 つは、 の演算子のオーバーロードのほとんどです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);

while(inputStream.good())
{
    入力ストリーム >> myString;
}

std::ifstream::inオープンモードとして使用しないと、あなたと同じエラーが発生しました。このパラメーターの値を確認することをお勧めします。

于 2012-04-11T19:44:53.153 に答える