CLion C++无法读取/打开项目目录中的.txt文件

26

我在我的项目目录中有一个 .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之外,其他都正常。非常奇怪。

添加一些细节..............更多细节?:(


我认为要解决你的问题,你得把文件结构发送给我们… - Luca Schimweg
也许你的 IDE 设置了另一个工作目录。 - Piotr Siupa
我目前正在研究这个问题。所有我看到的东西都说它会在项目目录中查找。 - Rekumaru
有可能你的可执行文件的工作目录设置在另一个位置。为了验证这一点,尝试给出你的文件的绝对路径。 - A.S.H
它表示当构建exe时,它会从以下位置运行:/Users/asd/Library/Caches/clion10/cmake/generated/1f60a9d3/1f60a9d3/Debug/Project5withTemplates - Rekumaru
6个回答

37

Clion会查找输入文件并将输出文件写入Debug文件夹。如果您将输入文件放在那里,它就能找到它们。


15

我假设当前的工作目录被设置为可执行文件的路径而不是您的CMakeLists.txt文件的路径。

为了解决这个问题,两种方法:

  1. 将.txt文件放在可执行文件旁边
  2. 显式设置调试的工作目录
  3. 按照ti7的答案所述输入.txt文件的完整路径。

11
如果inputFile.is_open()总是返回false,那么inputFile.open("twoday.txt");可能无法正确打开文件,可能是因为找不到"twoday.txt"
尝试设置明确的路径,如"c:/path/twoday.txt""/path/twoday.txt"(如果您使用Linux)。您也可以尝试写入一个文件,以查看它出现在哪里,或者尝试更多奇特的方法来返回当前路径。

我会尝试写入文件。 - Rekumaru
这是正在发生的事情。既然你有第一个答案,我就给你。谢谢。 - Rekumaru

1
其他答案已经指出了问题,这与CLion无关。当任何可执行文件启动时,它都有一个当前工作目录。默认情况下,它是可执行文件所在的目录。如果要读取的文件存在于其他位置,则必须执行以下三项操作之一:
  • 使用完全限定的文件路径名。如果您在运行时键入文件名,这有点麻烦。
  • 将数据文件复制到可执行文件所在的主目录。但是,当您构建发布版而不是调试版本时,您需要再次复制它。
  • 使用CLion非常好用的UI,在启动时将可执行文件的当前工作目录设置为另一个值,例如您的项目或数据文件夹。

我创建了一个简短的教程视频,介绍如何完成最后一个步骤: https://youtu.be/dTtZEAfh_LM


0
我发现如何在CLion中设置CMake以在您的项目目录中构建。
  1. 转到文件:设置
  2. 现在导航到构建、执行、部署部分
  3. 在那里,在构建下,您可以指定相对于项目的构建路径

我刚把我的设置为".\build",现在它总是构建到我的项目,包括您制作的文件。


0

我遇到了同样的问题:

  1. 使用 Ctrl + Alt + F12 获取完整文件路径

  2. 调用 inputFile.open()

  3. 愉快地编码吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接