0

私は比例計算機を書いています。プログラムの開始時に、同じフォルダー内の .txt から ASCII テキスト アート画像を読み込みます。

これが私がやっている方法です:

//Read picture
string line;
ifstream myfile("/Users/MYNAME/Desktop/MathScripts/Proportions/Value Finder/picture.txt");
if (myfile.is_open()) {
  while (!myfile.eof()) {
    getline(myfile, line);
    cout << line << endl;
  }
  myfile.close();
} else cout << "Unable to load picture!!!" << endl;
//Finish reading txt

.txt が同じフォルダーにある場合、名前だけを使用でき、ディレクトリを言う必要はないと聞きました。代わりの意味

/Users/MYNAME/Desktop/MathScripts/Proportions/Value Finder/picture.txt

「picture.txt」を使用できます。それは私にはうまくいきません。コードを編集しなくても、ユーザーが「Value Finder」フォルダー内を移動できるようにしたいと考えています。

私はMacを使用しており、 CodeRunnerを使用しています。何かおかしい?

picture.txt が私のコードと同じフォルダーにあることを確認するように言わないでください。です。

4

1 に答える 1

1

完全修飾パスを使用せずに開くpicture.txtには、現在の作業ディレクトリに存在する必要があります。IDE がアプリケーションを起動すると、現在の作業ディレクトリがアプリケーションと同じディレクトリに設定されます。アプリケーションとpicture.txtは異なるディレクトリにある場合、その名前だけでは開くことができません。現在の作業ディレクトリを取得する必要がある場合は、getcwdそのように呼び出すことができます。

char temp[MAXPATHLEN];
getcwd(temp, MAXPATHLEN);

ユーザーがどのディレクトリにあるかを指定できるようにしたい場合picture.txtは、コマンドラインで引数を渡すことができます。次に、提供されたディレクトリと画像ファイル名を使用して完全修飾パスを作成できます。

int main(int argc, const char **argv)
{
    // Add some logic to see if the user passes a path as an argument
    // and grab it. here we just assume it was passed on the command line.
    const string user_path = arg[1];

    //Read picture
    string line;
    ifstream myfile(user_path + "/picture.txt");
    if (myfile.is_open())
    {
        while (!myfile.eof()) {
            getline(myfile, line);
            cout << line << endl;
        }
        myfile.close();
    }
    else
    {
        cout << "Unable to load picture!!!" << endl;
    }
    //Finish reading txt

    return 0;
}

これで、次のようなことができます。

myapp "/user/USERNAME/Desktop/MathScripts/Proportions/Value Finder"

そして、そのディレクトリでファイルを探しpicture.txtます。(パス名にスペースがあるため、引用符が必要です)。

注: を呼び出しsetcwd()て、アプリケーションの現在の作業ディレクトリを変更できます。

于 2013-04-20T19:37:56.963 に答える