2011-12-01 74 views
1

我一直在編寫一個C++程序,最終將從文本文件中刪除某些不需要的格式。不幸的是,我還遠遠達不到這個目標。C++在用戶輸入的不同目錄中打開文件

我目前的問題是我似乎無法打開位於給定(用戶輸入)目錄中的文本文件。下面是我在哪裏到目前爲止,剝離最不需要的大頭:

//header, main function, bulk 

//variable definitions 
FILE * pFile; 
//char filePathBuffer [512]; --unused, from older attempts 
string currentLine = "", command = "", commandList = "ct", filePath = "defaultPath"; 
int quotePos = 0, slashPos = 0, bufferLength = 0; 
bool contQuote = true, contSlash = true; 

cout << "> "; 
getline(cin, command); 

//various exit commands 
while(command != "q" && command != "quit" && command != "exit") { 

    //check for valid commands stored in a string 
    //--definitely not the best way to do it, but it's functional 

    if(commandList.find(command) == commandList.npos) { 
     puts("\nPlease enter a valid command.\n"); 
    } 
    else if(command == "t") { 
     puts("\nPlease enter the file path:\n"); 
     cout << "> "; 
     getline(cin, filePath); 

     //rip all quotes out of the entered file path 
     while(contQuote == true) { 
      quotePos = filePath.find("\""); 

      if(quotePos == filePath.npos) 
       contQuote = false; 
      else 
       filePath.erase(quotePos, 1); 
     } 

     pFile = fopen(filePath.c_str(), "r+"); 

     //I've also tried doing countless variations directly in the code, 
     //as opposed to using user-input. No luck. 
     //pFile = fopen("C:\\test.txt", "r+"); 

     if(pFile!=NULL) { 
      cout << "\nFile opened!" << endl << endl; 
      fclose (pFile); 
     } 
     else 
      cerr << "\nFile failed to open!\n\n"; 

    } 

    //reset variables to default values 
    quotePos = -1; 
    slashPos = -1; 
    contQuote = true; 
    contSlash = true; 

    cout << "> "; 
    getline(cin, command); 
} 

我沒有實際確認輸入的字符串是否應該有報價或不 - 我不能讓他們的工作無論哪種方式。我也嘗試做一個filePath.find('\\')來查找反斜槓(這樣我就可以在filePath中添加第二個反斜槓以進行正確的解析),但最終沒有運氣。

你們有什麼想法我可以解決這種情況嗎?

謝謝!

+0

您正在使用哪個平臺? – FailedDev

+0

Windows 7 64位。 –

+0

然後我的解決方案應該工作:) – FailedDev

回答

1

我建議你看看什麼filePath包含當你打電話給fopen。然後你將能夠看到發生了什麼問題。

兩種方法:

  1. 打印出來fopen的調用您調用fopen

  2. 使用調試器之前的價值,地方的斷點,並檢查文件路徑

+0

是的,我也想到了 - 我已經做到了,無數次。當我輸入C:\ test.txt時,它打印出C:\ test.txt。 –

+0

那好像很好。文件是否存在? – ravenspoint

+0

是的,文件存在。如果我在與可執行文件相同的目錄中使用文件,代碼工作正常。 –

1

我想你是在從\\判斷的窗口。

試試這個功能:

#include <windows.h> 
bool fileExist(const std::string& fileName_in) 
{ 
    DWORD ftyp = GetFileAttributesA(fileName_in.c_str()); 
    if (ftyp == INVALID_FILE_ATTRIBUTES) 
    return false; 
    if (ftyp & FILE_ATTRIBUTE_DIRECTORY) 
    return false; // this is a directory 
    return true;  // this is a normal file 
} 

嘗試使用此功能的輸入字符串。如果它返回false,告訴你的用戶他是盲人:)

+0

它返回true - 因此它看到該文件。然後不確定發生了什麼問題。 :)編輯:哇,多麼尷尬。我忘了以admin身份運行我的可執行文件。謝謝您的幫助! –

+0

@ 13ack.Stab沒問題:) .. – FailedDev

0

貌似內容許可問題。你在其他子目錄中嘗試過嗎?當fopen()返回時,我添加了一些代碼來檢查errno值 - 請注意下面的「Permission Denied」:

> t 

Please enter the file path: 

> .\test.cpp 

File opened! 

> t 

Please enter the file path: 

> c:\setup.log 

File failed to open with error: Permission denied 

> t 

Please enter the file path: 

> c:\cygwin\cygwin.bat 

File opened! 

> 
相關問題