CLion C++ 无法在项目目录中 read/open .txt 文件
CLion C++ can't read/open .txt file in project directory
我的项目目录中有一个 .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 外,其他一切正常。很奇怪。
添加一些细节......更多细节? :(
if inputFile.is_open()
always returns false
, inputFile.open("twoday.txt");
没有正确打开文件,估计是找不到 "twoday.txt"
如果您使用 Linux,请尝试设置一个显式路径,如 "c:/path/twoday.txt"
或 "/path/twoday.txt"
。您也可以尝试编写一个文件,而不是查看它出现在哪里,或者 return 当前路径更奇特的东西。
我假设工作目录被设置为可执行文件的路径,而不是您的 CMakeLists.txt 文件。
要解决此问题,请:
- 将 .txt 放在可执行文件旁边
- Explicitly set the working directory for debugging
- 输入 .txt 文件的完整路径,如 ti7 的回答中所述。
我发现了如何在 CLion 中将 CMake 设置为在您的项目目录中构建。
- 转到file:Settings
- 现在导航到构建、执行、部署部分
- 在构建下你可以指定相对于你的项目的构建路径
我只是将我的设置为“.\build”,现在它总是构建到我的项目中,包括您创建的文件。
Clion 查找输入文件并将输出文件写入 Debug 文件夹。如果您将输入文件放在那里,它将看到它们。
其他答案指出了问题所在,这确实与 CLion 无关。当任何可执行文件启动时,它都有一个当前工作目录。默认情况下,这是可执行文件所在的目录。如果您要读取的文件位于其他任何地方,您必须执行以下三项操作之一:
- 为您的文件使用完全限定的路径名。如果您在运行时输入文件名,那会有点痛苦。
- 将您的数据文件复制到可执行文件的主目录。但是当你构建发布版本而不是调试版本时,你需要再次复制它。
- 使用 CLion 非常好 UI 将启动时可执行文件的当前工作目录设置为不同的值,例如您的项目或数据文件夹。
我制作了一个关于如何完成最后一项的简短教程视频:
https://youtu.be/dTtZEAfh_LM
我遇到了同样的问题:
执行:Ctrl + Alt + F12 获取完整文件路径
inputFile.open()
快乐编码
我的项目目录中有一个 .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 外,其他一切正常。很奇怪。
添加一些细节......更多细节? :(
if inputFile.is_open()
always returns false
, inputFile.open("twoday.txt");
没有正确打开文件,估计是找不到 "twoday.txt"
如果您使用 Linux,请尝试设置一个显式路径,如 "c:/path/twoday.txt"
或 "/path/twoday.txt"
。您也可以尝试编写一个文件,而不是查看它出现在哪里,或者 return 当前路径更奇特的东西。
我假设工作目录被设置为可执行文件的路径,而不是您的 CMakeLists.txt 文件。
要解决此问题,请:
- 将 .txt 放在可执行文件旁边
- Explicitly set the working directory for debugging
- 输入 .txt 文件的完整路径,如 ti7 的回答中所述。
我发现了如何在 CLion 中将 CMake 设置为在您的项目目录中构建。
- 转到file:Settings
- 现在导航到构建、执行、部署部分
- 在构建下你可以指定相对于你的项目的构建路径
我只是将我的设置为“.\build”,现在它总是构建到我的项目中,包括您创建的文件。
Clion 查找输入文件并将输出文件写入 Debug 文件夹。如果您将输入文件放在那里,它将看到它们。
其他答案指出了问题所在,这确实与 CLion 无关。当任何可执行文件启动时,它都有一个当前工作目录。默认情况下,这是可执行文件所在的目录。如果您要读取的文件位于其他任何地方,您必须执行以下三项操作之一:
- 为您的文件使用完全限定的路径名。如果您在运行时输入文件名,那会有点痛苦。
- 将您的数据文件复制到可执行文件的主目录。但是当你构建发布版本而不是调试版本时,你需要再次复制它。
- 使用 CLion 非常好 UI 将启动时可执行文件的当前工作目录设置为不同的值,例如您的项目或数据文件夹。
我制作了一个关于如何完成最后一项的简短教程视频: https://youtu.be/dTtZEAfh_LM
我遇到了同样的问题:
执行:Ctrl + Alt + F12 获取完整文件路径
inputFile.open()
快乐编码