2015-07-02 4 views
2

Допустим, у меня есть эта функция:Печать путь к файлу из переменной в C++

void printPathToFile(std::wstring myPath){ 
    std::wstringstream ss; 
    ss << myPath; 
    //When printing myPath as soon as there is a \ it stops so this information is lost. 
    ss << getOtherReleventLogingInformation(); 

    std::wofstream myfile; 
    myfile.open ("C:\\log.txt", std::wofstream::app|std::wofstream::out); 
    myfile << ss.str(); 
    myfile.close(); 
} 

Я не контролировать myPath аргумент. Прямо сейчас он не имеет \\ в имени пути, поэтому поток интерпретирует их как escape-последовательность, которая не то, что я хочу.

Как использовать переменную std :: wstring в качестве исходной строки?

Если бы это был строковый литерал, я мог бы использовать R"C:\myPath\", но как мне добиться того же самого результата без строкового литерала?

Возможным подходом может быть цикл через имя пути и добавление дополнительной обратной косой черты, где необходимо, но, несомненно, C++ имеет нечто более прочное и элегантное ..?

EDIT:

Моя проблема была диагностируется. Оказывается, что обратная косая черта не вызывают каких-либо проблем, что я должен был добавить был:

#include <codecvt> 
#include <locale> 

const std::locale utf8_locale 
     = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>()); 
myFile.imbue(utf8_locale); 

Как объяснено здесь: Windows Unicode C++ Stream Output Failure

Путь к файлу теперь отображается правильно, я думал, что с помощью wofstream заботилась местных жителей для вас, чтобы символы, отличные от ANSII, отображались правильно.

+0

Где? temp_str'? – jpo38

+0

Извините temp_str был ошибкой, которую я отредактировал. – Asics

ответ

1

Я хотел бы предложить вам просто заменить \\ на /, они работают одинаково (даже лучше, потому что они действуют на всей платформе):

void printPathToFile(std::wstring myPath) 
{ 
    std::wstring mySafePath = myPath; 
    std::replace(mySafePath.begin(), mySafePath.end(), '\\', '/'); 

    // then use mySafePath in the rest of the function.... 
} 
0

Это делает: повысить файловую систему. Вы используете path, чтобы пройти, ну, пути, вокруг, а не строки. Вот привет мир для повышающей файловой системы:

int main(int argc, char* argv[]) 
{ 
    path p (argv[1]); // p reads clearer than argv[1] in the following code 

    if (exists(p)) // does p actually exist? 
    { 
    if (is_regular_file(p))  // is p a regular file? 
     cout << p << " size is " << file_size(p) << '\n'; 

    else if (is_directory(p))  // is p a directory? 
     cout << p << "is a directory\n"; 

    else 
     cout << p << "exists, but is neither a regular file nor a  directory\n"; 
    } 
    else 
    cout << p << "does not exist\n"; 

    return 0; 
} 

http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/tutorial.html

Edit: Отмечу также, что эта библиотека рассматриваются для добавления к стандарту, и в настоящее время может быть использована из станд :: экспериментальное пространства имен, в зависимости на вашем языке для компилятора/стандартной библиотеки: http://en.cppreference.com/w/cpp/header/experimental/filesystem

Смежные вопросы