2017-03-14 6 views
0

開こうとするファイル名が指定されているCode :: BlocksのC++宿題プロジェクトで作業しています最初のコマンドライン引数で指定します。私が開こうとしているファイルは、InputFile1.txtというタイトルです。C++ Code :: Blocksでフルパスでファイルを開くことができますが、相対パスではなくコマンドライン引数で開くことができます

#include <iostream> 
#include <cstdlib> 
#include <fstream> 
#include <unistd.h> 
using std::cout; 
using std::ifstream; 
using std::ofstream; 
using std::cerr; 

int main(int argc, char *argv[]) 
{ 
    ifstream inputFile; 

    puts(getcwd(0,1234)); 

    inputFile.open(argv[1]); 
    if (inputFile.is_open()) 
    { 
     cerr << "Couldn't open file " << argv[1]; 
     return(EXIT_FAILURE); 
    } 

    cout << "\nThe file to search is: " << argv[1]; 

    return(EXIT_SUCCESS); 
} 

エラーメッセージ "ファイルを開くことができませんでした。InputFile1.txt"が表示されます。しかし、InputFile1.txtへの完全なパスを入力すると、ファイルが正常に開き、メッセージの出力が下部に表示されます。次のトラブルシューティング手順を実行しました。

  1. 同じIDEで実行されているCプログラムでファイルを正常に開いた。
  2. ファイル名のスペルが正しくあり、最初のコマンドライン引数であることを確認しました。また、geditでファイルを開いた。
  3. puts(getcwd(0,1234)ステートメントによる現在の作業ディレクトリの出力と一致するファイルパスを確認したもの)
  4. コードの検証::プロジェクト実行の作業ディレクトリをブロックする(プロジェクト>プロパティ>ビルドターゲット - )InputFile1.txtが作業ディレクトリにあったことがステップ3の出力にマッチした、と。
  5. は、ディレクトリ1つのレベルアップに作業ディレクトリを変更し、ディレクトリにInputFile1.txtをコピーした。もう一度、フルパスでの成功が、ないようARGV [1]

私の分析:。

  • 私はそれがファイルのアクセス許可ではないと思います。そうでなければ、geditまたは完全なパスで開くことはできません。
  • 私はそれがExecution作業ディレクトリであるとは思わないか、Code :: Blocks内で実行されるCプログラムのために開かれていないと思います。
  • 私のC++コードやCode :: Blocksの設定と関係があります。 /ヘルプ

任意の洞察力をいただければ幸いです。

+0

あなたのIDEはあなたのアプリケーションと同じ作業ディレクトリを持っておらず、相対パスでアプリケーションを起動します。 'debug32 \ my_app.exe';したがって、任意のファイルへの相対パスは異なる場合があります(相対パスは、アプリケーションディレクトリではなく作業ディレクトリとの相対パスです)。コマンドラインから(IDEの外で)実行するとアプリケーションが正しく動作しますか?また、 'argv [0]'を表示してアプリケーションの呼び出し方法を調べてみてください。 –

+0

私のトラブルシューティングでは、Code :: Blocks Project Bin&Objディレクトリに関するスタックオーバーフローのポストを読んで、それぞれのディレクトリにコピーを移動してファイルを開くことで解決策を強制しようとしました。失敗。 – Crispy

+0

リチャード - あなたの助けをありがとう!次回は、Code :: Blocksでファイルを開く際に問題があることを念頭においてください。 – Crispy

答えて

0

上記のコードが正しく動作していたことが判明しました。以下のコードでのif文:

inputFile.open(argv[1]); 
if (inputFile.is_open()) 
{ 
    cerr << "Couldn't open file " << argv[1]; 
    return(EXIT_FAILURE); 
} 

は、ファイルが正常に開かれたときにtrueを返した表現inputFile.is_open()、結果を評価しました。ファイルが正常に開かれなかったかどうかを確認するには、式!inputFile.is_open()が使用されているはずです。この問題を解決するための私の教授のおかげで、エラーはすべて自分のものでした。

関連する問題