2016-08-25 5 views
0

fstreamを使用してC++でファイルを読み込もうとしています。 しかし、is_open()関数は常に0の結果を返し、readline()は何も読み込みません。下記のコードスニペットをご覧ください。C++のis_open()関数は常に0の値を返し、getLine(myFile、line)は何も返しません。

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    ifstream myfile("D:\xx\xx\xx\xx\testdata\task1.in.1"); 
    if (myfile.is_open()) { 
     while (getline(myfile, line)) { 
      cout << line << '\n'; 
     } 
     myfile.close(); 
    } 

    else 
     cout << "Unable to open file"; 

    return 0; 
} 

答えて

5

あなたはD:\<somepath>\testdata\task1.in.1

を開いているが、実際にあなたが\tが集計として解釈されているのでD:\<somepath><tabulation char>estdata<tabulation char>ask1.in.1をオープンしようとしていると思います。

(!error: \x used with no following hex digits多分あなたに、より良い話をしているでしょう\xは特別すぎるところでそれが実際のパスではないか、別のエラーがあっただろう)(のような\nprintf("hello world\n");で改行です)

あなたはこのようなバックスラッシュエスケープする必要があります。

D:\\xx\\xx\\xx\\xx\\testdata\\task1.in.1

Windowsはまた、それらのようなパスを受け入れますNathanOliverはあなたが使用することができ、上述のよう

D:/xx/xx/xx/xx/testdata/task1.in.1

:、より便利に、あなたがcdコマンドまたはそのようにバッチスクリプトを生成する場合を除き、バックスラッシュを(/はバッチコマンドのオプションスイッチとして使用されている)が必要となりますあなたのコンパイラがC++ 11モードが有効になっている場合には、生のプレフィックス(または--std=c++11付き)

R"(D:\xx\xx\xx\xx\testdata\task1.in.1)"

最後の言葉:それを離れるの汚い方法:

その場合には大文字を使用して

D:\Xx\Xx\Xx\Xx\Testdata\Task1.in.1

窓がケースであるためであると小文字を区別しない

  • Cは、バックスラッシュを聞かせ

    1. を働くだろう。

    しかし、これは運が単なるものです。多くの人が、バグに非常に近いことを認識せずにこれを行います。 ところで、多くの人がWindowsパスを大文字にしています(このサイトでは多く見られます)。理由を知らなくてもパスが小文字で動作しないことに気付いたからです。

  • +0

    あなたは正しいことを覚えています。あなたがコメントしたときにそれを入力していました。あなたがファイルI/Oだけを行うなら、この方法で作業することができます(Linuxに切り替えるときに、より多くの移植可能なコード、少なくとも相対パスまたは相対インクルードパスにも役立ちます)。 –

    +1

    '" \ Xx "' hack:素晴らしい! –

    +0

    パーフェクトジャン!私は\ t事を逃した。どうもありがとう。出来た。 – Abhijit

    関連する問題