использование файловой системы boost в глобальной ошибке - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь выполнить следующую строку в глобальном приспособлении, но это дает мне ошибку.
файл - это путь со следующими данными:

 D:\\back_up_starting_1_18_2020\\visual_studio_programs_all_last_2020\\visual_studio\\Projects\\c++\\c++_2020_3_17_ninety47\\dukascopy-master\\dukascopy-master\\..\\test\\data\\raw\\GBPJPY\\2012\\11\\03\\01h_ticks.bin

file = fs::canonical(file);

я удалил код, чтобы установить путь, и когда я удаляю ". msgstr "мой код работает нормально
это строка file = fs :: canonical (file); неверно ????

обновление:
Я обнаружил, что проблема не связана с модульным тестированием буста, но связана с ifstream.
, поэтому я сделал этот краткий код, чтобы воспроизвести проблему.

// ifstream_arg.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
// ifstream constructor.
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

int main() {

    std::string filename = "./test.txt";
    //const char * filename = "./test.txt";

    fs::path file(filename);

    file = fs::canonical(file);
    std::cout << filename << '\n';
    std::cout << file.generic_string() << '\n';
    std::cout << file.string() << '\n';
    std::cout << file.string().c_str() << '\n';
    std::cout << file.c_str() << '\n';
    ////filename = ("\\\\?\\" + file.generic_string()).c_str();
    filename = file.generic_string().c_str();
    std::cout << filename << '\n';

    //std::ifstream ifs("test.txt", std::ifstream::in);
    std::ifstream ifs(filename, std::ifstream::binary);

    char c = ifs.get();

    while (ifs.good()) {
        std::cout << c;
        c = ifs.get();
    }

    ifs.close();

    return 0;
}

когда я использую имя файла в качестве строки, ifstream работает нормально.
Но когда я использую его как указатель на const char, это выдает ошибку.
Я читаю использование std :: ifstream и говорит: что ifstream может работать как со строкой, так и с указателем на const char ????
в чем моя ошибка ??

1 Ответ

0 голосов
/ 22 марта 2020

я нашел ошибку.
она в строке:

filename = file.generic_string().c_str();

здесь указатель, возвращаемый из точек rhs к результату generic_string (), который уничтожается в конце выражения, так что имя файла становится висящим указатель и ошибка.
Так что я либо передаю полное выражение rhs в ifstream, либо устанавливаю переменную с его помощью

...