web-dev-qa-db-ja.com

CLion C ++がプロジェクトディレクトリの.txtファイルを読み書きできない

プロジェクトディレクトリに.txtファイルを作成し、データを入力しました。

ディレクトリ構造は次のようになります。

/Users/asd/ClionProjects/ProjectWithTemplates/
main.cpp
cmake
twoday.txt

これが私のコードです:

#include <iostream>
#include <array>
#include <cmath>
#include <fstream>


using namespace std;

/* print array prototype */
template <size_t N>
void printArray(const array<double , N> & arr);

/* mean function prototype */
template <size_t N>
double meanArray(const array<double , N> & arr);

/* standard deviation prototype */
template <size_t N>
double sDeviation(const array<double , N> & arr);

int main() {

    string date1;
    string date2;

    array<double, 24> day1Temps;
    array<double, 24> day2Temps;
    array<double, 3> testarr = {75,70,65};

/* TESTING PURPOSES */
    printArray(testarr);
    sDeviation(testarr);
    cout << "standard deviation of array is: " << sDeviation(testarr) << endl;
    cout << "mean of array is: " << meanArray(testarr) << endl;
/* END TESTING */

    ifstream inputFile;
    inputFile.open("twoday.txt");

    if(inputFile.is_open())
    {
        inputFile >> date1;
        inputFile >> date2;

        for(int i = 1; i < day1Temps.size(); ++i)
        {
            inputFile >> day1Temps[i];
        }

        for (int j = 1; j < day2Temps.size(); ++j) {
            inputFile >> day2Temps[j];
        }
    } else cout << "File unable to open. File does not exist." << endl;


    return 0;
}

/* print array defination */
template <size_t N>
void printArray(const array<double , N> & arr){

    for(const auto & i : arr)
    {
        cout << i << " ";
    }
    cout << endl;
}

/* mean function defination */
template <size_t N>
double meanArray(const array<double , N> & arr){

    double sum;

    for (const auto & i : arr) {
        sum+=i;
    }

    return sum/arr.size();
}

/* standard deviation defination */
template <size_t N>
double sDeviation(const array<double , N> & arr){

    double mean = meanArray(arr);
    double total;

    for (const auto & i : arr){
        total+=pow(i - mean, 2);
    }
    return sqrt(total/arr.size());
}

私のファイルIO以外のすべてが正常に動作します。非常に奇妙な。

いくつかの詳細を追加します..............詳細を追加しますか? :(

16
Rekumaru

inputFile.is_open()が常にfalseを返す場合、inputFile.open("twoday.txt");はファイルを正しく開いていません。おそらく"twoday.txt"が見つからないためです。

Linuxを使用している場合は、"c:/path/twoday.txt"または"/path/twoday.txt"のような明示的なパスを設定してみてください。代わりにファイルを書き込んで、それがどこに表示されるかを確認したり、現在のパスを返すよりエキゾチックなものを試したりすることもできます。

2
ti7

Clionは入力ファイルを検索し、出力ファイルをDebugフォルダーに書き込みます。入力ファイルをそこに置くと、それらが表示されます。

19

作業ディレクトリがCMakeLists.txtファイルではなく実行可能ファイルへのパスに設定されていると仮定します。

これを修正するには、どちらか:

  1. 実行可能ファイルの隣に.txtを置きます
  2. デバッグ用に作業ディレクトリを明示的に設定
  3. Ti7の回答で説明されているように、.txtファイルへの完全パスを入力します。
8
Russell Greene

他の回答は問題を特定しますが、これは実際にはCLionとは何の関係もありません。実行可能ファイルが起動すると、現在の作業ディレクトリがあります。デフォルトでは、これは実行可能ファイルが存在するディレクトリです。読み取りたいファイルが他の場所にある場合は、次の3つのいずれかを行う必要があります。

  • ファイルには完全修飾パス名を使用してください。実行時にファイル名を入力するのはちょっと面倒です。
  • データファイルを実行可能ファイルのホームにコピーします。ただし、デバッグビルドではなくリリースビルドをビルドするときに、もう一度コピーする必要があります。
  • CLionの非常に優れたUIを使用して、起動時に実行可能ファイルの現在の作業ディレクトリをプロジェクトやデータフォルダーなどの別の値に設定します。

最後を達成する方法についての簡単なチュートリアルビデオを作成しました: https://youtu.be/dTtZEAfh_LM

1
Anne Gunn

CLionのプロジェクトディレクトリにビルドするようにCMakeを設定する方法を見つけました。

  1. ファイルに移動:設定
  2. 次に、ビルド、実行、デプロイメントセクションに移動します。
  3. ビルドの下で、プロジェクトに相対するビルドパスを指定できます

私は「。\ build」に設定しただけで、作成したファイルを含め、常にプロジェクトにビルドされます。

0
Ben Rasmussen

Clionはcmakeを介してc/c ++プロジェクトを手配します。私のOSはWindows 10です。cmakeが生成する実行可能ファイルは、cmake-build-debugにあります。絶対パスまたは「../」を使用できます。

0
amon hao