C++基本文件IO位置

3

我刚开始学习文件IO。我在我的Mac上使用一个叫做CodeRunner的程序,并且我有一个包含以下文件的文件夹:

validsudoku.cpp、validsudoku和sudokugood0.txt

我写的代码开头是:

int main(int argc, char const *argv[]){

//string filetoopen;
ifstream sudokutxtfile;
string txtline;
string sudokubox[9]; 
//bool goodsudoku = true;
//int i, j, row, column;

/*
if (argc == 2)
    filetoopen = argv[1];
else
    filetoopen = "sudokuboard.txt";
*/  

//read in file, save to array, close file
sudokutxtfile.open("sudokugood0.txt");  
while (getline(sudokutxtfile,txtline)) 
{
    sudokubox[row] = txtline;   
    row++;
}
sudokutxtfile.close();

现在,为了测试这个功能,我只需打开名为"sudokugood0.txt"的文件,不过一旦我让它运行起来,我就会将其更改为我的'filetoopen'变量,这样我就可以通过终端输入文件名。

现在来说我的问题:当我在CodeRunner中运行.cpp时,它可以正确地看到.txt文件并对其进行处理,但是当我将可执行文件和.txt文件放在我的bin文件夹中,并尝试从终端运行它时,它就无法看到.txt文件。我是在使用错误的位置还是遗漏了什么东西?

附带问题:它可以在MacOS上运行,但在我必须使用Codeblocks的Xubuntu VMbox中它出现了“分段错误(core dumped)”这个问题。有人知道为什么吗?我在两个文件的顶部都有这个:

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

1
非绝对文件名是相对于当前工作目录而不是可执行文件的。如果您在运行程序时不在“bin”目录中,则它将无法正常工作。 - user657267
哦,我猜我应该试一下那个方法;/ 谢谢。有没有简单的方法让它在任何地方都能工作? - Austin
1个回答

2
该程序试图在当前工作目录中查找您打开的文件,而不是在可执行文件所在位置查找。当您从终端执行程序时,当前目录就是您所在的目录。因此,如果您执行cd ~/进入您的主目录,然后运行程序,该程序将在您的主目录中查找该文件。如果您切换到其他目录,则该程序将在该新目录中查找该文件。
自然的解决方案要么是将输入文件作为参数传递给可执行文件,要么作为输入请求(我建议使用第一种方法)。

谢谢,我按照你的建议做了,现在在OSX上可以运行了。不知道为什么完全相同的代码在我的Xubuntu VMbox上在Codeblocks中无法工作?我认为这可能与我使用的库有关,但我不太确定。 - Austin
@AustinMW 可能是因为程序的当前目录不是你认为的那样,使用集成开发环境 (IDE) 时很少会出现这种情况。通常,在 IDE 中,当前目录是项目根目录,而程序则是在另一个子目录中创建的。 - Some programmer dude
但是当它找不到文件时,它会给我一个“分段错误(core dumped)”的错误,而不是说“无效”。 - Austin
1
@AustinMW 那你肯定是做了一些没有向我们展示的事情。使用调试器来捕获崩溃,并且如果你无法解决问题,请提出一个新的问题。 - Some programmer dude

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