1

getlineが1つのX-Codeプロジェクトで機能しているのに、別のプロジェクトでは機能していない理由がわかりません。エラー「'getline'の呼び出しに一致する関数がありません。単一のcppファイルを作成すると、問題なくコンパイルされます。

  // reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
      string line;
      ifstream myfile ("example.txt");
      if (myfile.is_open())
      {
        while ( myfile.good() )
        {
          getline (myfile,line);
          cout << line << endl;
        }
        myfile.close();
      }

  else cout << "Unable to open file"; 

  return 0;
}

本当に助かります。私はちょうど学んでいて、上記の例は私のテストブックから来ました。

4

2 に答える 2

5

コードはノイズが多く、正しくありません。正しい標準イディオムは次のとおりです。

#include <fstream>   // for std::ifstream
#include <string>    // for std::getline and std::string

std::ifstream myfile("example.txt");

if (!myfile) { /* error, die */ }

for (std::string line; std::getline(myfile, line); )
{
    std::cout << "Read one line: '" << line << "'\n";
}

正しさ:

  • 入力を消費するに、入力操作の成功を確認する必要があります。それ以外の方法で行うことはUBである可能性があり、確かに決して正しくありません。

  • [これを指摘してくれた@Jamesに感謝します:]good()ファイルが開かれたかどうかをチェックしません。またはのいずれ!myfile.fail()かを使用できますmyfile.is_open()が、気にしないでください(以下を参照)。

ノイズ:

  • コンストラクターはifstreamファイル名を取得し、すでにファイルを開きます。これを使って。

  • デストラクタでクリーンアップします。明示的にifstreamクリーンアップする必要はありません。使い終わったらすぐにファイルを閉じるためにタイトなスコープを使用してください。

  • line必要がない場合は、アンビエントスコープに漏れないでください。

  • good()(または正しい代替手段のいずれか)の必要はありません。ifstreamブールコンテキストでオブジェクトを評価するだけで、ファイルが正常に開かれたかどうかを確認できます。

于 2013-01-28T08:39:58.943 に答える
1

実際のエラーが1つありますgetline 。それは、成功したかどうかをテストせずにの結果を使用することです。内部ループを作成する通常の方法は次のとおりです。

std::string line;
while ( std::getline( myfile, line ) ) {
    std::cout << line << std::endl;
}

他の問題はスタイルの問題ですが、一部の問題はほぼ普遍的なコンセンサスを享受しています。たとえば、必要になる前に変数を定義しないでください(したがって、の定義は lineループの直前にする必要があります)。エラー出力は、 EXIT_FAILURE0`std::cerrではなくに送られます。std::out. And in case of an error, you should return, and not

また、入力を明示的に閉じる必要がないことも一般的に認められています(デストラクタがそれを処理し、すでにすべてを正常に読み取っているため)。他の人にとってはコンセンサスは完全ではありません。using namespace std;たとえば、 私は決して使用せずelse、同じ行の後にコードを配置することもありません。また、anの短い条件がif...else最初の場合、コードが読みやすくなるので、次のように記述します。

if ( !myfile.is_open() ) {
    std::cout << "Unable to open file" << std::endl
    returnCode = EXIT_FAILURE;
} else {
    std::string line;
    while ( std::getline( myfile, line ) ) {
        std::cout << line << std::endl;
    }
    returnCode = EXIT_SUCCESS;
}

より複雑なものを除いて、私はファイルの処理を別の関数に分解します。だから私は次のようなものになってしまいます:

if ( myfile.is_open() ) {
    process( myfile );
} else {
    //  error handling...
}

std::getlineしかし、投稿していないコードに問題があることを示唆しているようです 。2つの明白な考えられる説明があります:あなたが含まなかった<string>か、あなたはそれの前を忘れましstd::た。他にも考えられる説明がありますが、実際には、何が間違っているのかを正確に伝えることができないコードを確認する必要があります。

于 2013-01-28T09:17:15.397 に答える