2011-09-17 182 views
0

我試圖打開C++中的文件,但它似乎讓我有點麻煩,這裏是與打開該文件至今交易代碼:讀取文件 - 無法打開

void CreateHistogram(string str_file, vector<HistogramWord> &result) { 
    string line; 
    long location; 
    HistogramWord newWord; 
    const char * filename = str_file.c_str(); 

    //ifstream myfile (str_file.c_str()); 
    ifstream myfile (filename); 
    //myfile.open(filename); 
    if (myfile.is_open()) { 
     while (myfile.good()) { 
      getline(myfile, line); 
      line = clarifyWord(line); 

好的,僅僅爲了一點解釋,HistogramWord是一個在頭文件中定義的結構,根據我在在線文檔中讀到的內容,文件名必須是const char *,這就是我所做的。將str_file轉換爲const char *

現在,我嘗試了一些不同的東西,這就是爲什麼一些代碼被註釋掉了。當它到達if (myfile.is_open())行時,它總是評估爲false。任何人似乎都知道爲什麼?

感謝, 布蘭登

+2

該文件確實存在嗎? – quasiverse

+0

是的,它確實存在,並且與主函數位於同一目錄中,所以我應該能夠將其稱爲「test.txt」,正確嗎? – Brandon

+0

我也用'myfile.open(filename)試了一下''註釋掉了,但它仍然不想工作:/ – Brandon

回答

1

OK IO 101

如果你不給完整的文件路徑,但只有文件名,則當前的工作目錄將被追加到文件名。

所以,如果您的.exe位於C:\ TEMP和你從這個目錄中調用你的程序,你的文件名的test.txt那麼在這種情況下,完整的文件名是C:\ TEMP \ test.txt的

這隻有在.exe和test.txt都在C:\ temp下時纔有效。

在所有其他情況下,它會失敗。你可以通過使用win API或linux的等價物創建絕對路徑 - 我不知道你在哪個平臺上。

現在,爲了讀取succsfully打開的文件這樣就足夠了:

void CreateHistogram(string str_file, vector<HistogramWord> &result) { 
string line; 
long location; 
HistogramWord newWord; 

ifstream myfile (str_file.c_str()); 
if (myfile.is_open()) { 
    while (getline(myfile, line)) { 
     line = clarifyWord(line); 
} 
else{ 
    //throw exception, print error message etc 
    throw std::exception(std::string("Couldn't open file : " + str_file).c_str()); 
} 
} 

編輯:感謝@沙巴茲·

+1

實際上,它需要位於您調用.exe文件的目錄中。因此,如果您位於目錄C:\中並且您調用temp \ test.exe,則它預計它位於C:\ not C:\ temp – Shahbaz

0

我最好的猜測是,Windows的「隱藏已知文件類型的擴展名」,所以該文件的名稱實際上與您在Windows中放置的名稱不同。例如,如果它是一個.txt文件,並將其命名爲test.txt,那麼實際名稱就是test.txt.txt,這是Windows的一個非常愚蠢的事情。

要更改此項,請轉到我的電腦 - >推銷 - >文件夾選項 - >並取消選中「隱藏已知文件類型的擴展名」框。這是爲XP。如果你有另一個窗口,它應該或多或少是相同的路徑。如果您沒有看到工具欄,請嘗試使用ALT + t(工具)或ALT + f(文件)使其顯示。

這個問題給我們很多人在大學第一學期帶來了麻煩。

相關問題