C ++ Открытие файлов в разных каталогах с пользовательским вводом - PullRequest
1 голос
/ 01 декабря 2011

Я пишу программу на 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 ]

1 голос
/ 01 декабря 2011

Я предлагаю вам взглянуть на то, что filePath содержит при вызове fopen.Тогда вы сможете увидеть, что происходит не так.

Два подхода:

  1. Распечатайте значение непосредственно перед вызовом fopen

  2. Использование отладчика, установка точки останова на вызов fopen и проверка содержимого пути к файлу

1 голос
/ 01 декабря 2011

Я полагаю, что вы находитесь в Windows, судя по \\.

Попробуйте эту функцию:

#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 голосов
/ 01 декабря 2011

Похоже, проблема с разрешением. Вы пробовали в других подкаталогах? Я добавил немного кода для проверки значения errno при возврате fopen () - обратите внимание на «Отказано в доступе» ниже:

> 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!

>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...