C ++使用用户输入打开不同目录中的文件

时间:2011-12-01 14:24:25

标签: c++ fopen fstream directory-structure

我一直在编写一个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中添加第二个反斜杠以进行正确的解析),但最后没有运气。

你们有什么想法可以解决这种情况吗?

谢谢!

3 个答案:

答案 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告诉你的用户他是盲人:)

答案 1 :(得分:1)

我建议您在调用fopen时查看filePath包含的内容。然后你就能看到出了什么问题。

两种方法:

  1. 在调用fopen之前打印出值

  2. 使用调试器,在fopen调用上放置断点并检查文件路径的内容

答案 2 :(得分: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!

>