web-dev-qa-db-fra.com

CLion C++ ne peut pas lire/ouvrir le fichier .txt dans le répertoire du projet

J'ai un fichier .txt dans mon répertoire de projet que j'ai créé et rempli de données.

la structure de répertoire ressemble à:

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

voici mon code:

#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());
}

Tout le reste fonctionne bien en plus de mon fichier IO. Très étrange.

ajout de quelques détails .............. plus de détails? :(

9
Rekumaru

si inputFile.is_open() renvoie toujours false, inputFile.open("twoday.txt"); n'ouvre pas le fichier correctement, probablement parce qu'il ne trouve pas "twoday.txt"

Essayez de définir un chemin explicite comme "c:/path/twoday.txt" ou "/path/twoday.txt" si vous utilisez Linux. Vous pouvez également essayer d’écrire un fichier à la place pour voir où il apparaît, ou quelque chose de plus exotique pour renvoyer le chemin actuel.

0
ti7

Clion recherche les fichiers d'entrée et écrit les fichiers de sortie dans le dossier Debug. Si vous mettez vos fichiers d'entrée ici, ils les verront.

12
kyle san clemente

Je suppose que le répertoire de travail est défini sur le chemin du fichier exécutable au lieu de votre fichier CMakeLists.txt. 

Pour résoudre ce problème, soit:

  1. mettre le .txt à côté du fichier exécutable
  2. Définit explicitement le répertoire de travail pour le débogage
  3. Entrez le chemin complet du fichier .txt comme expliqué dans la réponse de ti7.
5
Russell Greene

Les autres réponses identifient le problème, qui n’a en réalité rien à voir avec CLion. Quand un exécutable démarre, il a un répertoire de travail en cours. Par défaut, c'est le répertoire où réside l'exécutable. Si le fichier que vous voulez lire se trouve ailleurs, vous devez effectuer l'une des trois opérations suivantes:

  • Utilisez un nom de chemin complet pour votre fichier. Un peu pénible si vous tapez le nom du fichier au moment de l'exécution.
  • Copiez votre fichier de données à la maison de l'exécutable. Mais vous devrez ensuite le copier à nouveau lorsque vous construirez la version finale plutôt que la version de débogage.
  • Utilisez la très belle interface utilisateur de CLion pour définir le répertoire de travail actuel de l’exécutable au démarrage sur une valeur différente, telle que votre projet ou votre dossier de données.

J'ai créé un bref didacticiel vidéo sur la manière d'accomplir le dernier: https://youtu.be/dTtZEAfh_LM

0
Anne Gunn

J'ai découvert comment configurer CMake pour qu'il intègre le répertoire de votre projet dans CLion.

  1. Aller au fichier: Paramètres
  2. Maintenant, naviguez vers la section construction, exécution, déploiement
  3. Là, dans la construction, vous pouvez spécifier le chemin de construction relatif à votre projet

Je viens de définir le mien sur ".\Build" et maintenant, il intègre toujours mon projet, y compris le fichier que vous créez.

0
Ben Rasmussen