2015-06-18 34 views
3

所以我剛剛開始學習fileIO。我一直在用我的Mac上叫CodeRunner計劃,我有一個包含文件夾:C++基本fileIO位置

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文件。我是否使用了錯誤的位置或者是否錯過了其他的東西?

方面的問題:它運行在OSX中,但在我的Xubuntu使用代碼塊的Xboxuntu,我需要用於類我得到'分段錯誤(核心轉儲)'任何人都知道爲什麼?我有這個在我的文件的開頭兩個:

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

非絕對文件名相對於當前工作目錄而不是可執行文件。如果您在運行程序時不在'bin'目錄中,那麼它將無法工作。 – user657267

+0

哦,猜我應該嘗試過; /謝謝。有沒有簡單的方法可以讓它在任何地方都能工作? – Austin

回答

2

程序試圖找到你在當前工作目錄中打開文件,而不是從那裏可執行文件的位置。當你從終端執行程序時,當前目錄就是你所在的目錄。 cd ~/要轉到您的主目錄,然後運行程序,程序會在您的主目錄中查找該文件。如果您更改爲其他目錄,程序將在該新目錄中查找該文件。

自然的解決辦法是將輸入文件作爲參數傳遞給可執行文件,或者要求輸入文件作爲輸入(我推薦第一個)。

+0

謝謝我做了你的建議,現在可以在OSX上使用。任何想法爲什麼相同的確切代碼在我的Xubuntu VMbox上的代碼塊中不起作用?我認爲這可能與我使用的庫有關,但我不太確定。 – Austin

+0

@AustinMW可能是因爲程序的當前目錄不是你認爲的那樣,對於它很少使用的IDE。通常在IDE中,當前目錄是項目根目錄,而程序是在另一個子目錄中創建的。 –

+0

但是當它沒有看到一個文件時,它不會說'無效',它會給我提供錯誤Segmentation fault(核心轉儲) – Austin