在MinGW中使用wstring路径打开文件

问题描述

我正在使用library for parsing Standard MIDI Files,它允许您以两种方式读取文件

    bool MidiFile::read(const std::string& filename) {/* --- */}
    //and
    bool MidiFile::read(std::istream& input) {/* --- */}

要在MSVC中使用wstring路径打开midi文件,我可以这样做:

    MidiFile *mf = new MidiFile();
    fstream input;
    input.open(L"Файл.mid",ios::binary | ios::in);
    mf->read(input);
    input.close();

但是,似乎fstream::open类型的GCC不会像MSVC那样重载wstring方法。如何在MinGW中使用wsting路径打开文件并将其传递给Midifile库?还是有一种方法可以用C样式或其他库文件打开文件,然后以某种方式将数据从文件转换std::istream

解决方法

这是C ++ 17功能。确保编译器足够新,并且至少要使用-std=c++17进行编译。

请注意,仅当std::filesystem::path::value_typewchar_t时才编译,换句话说-仅在Windows上编译。要使代码可移植,请首先将路径转换为std::filesystem::path

,

我找到了可以接受的解决方案,但速度较慢:

#include <string>
#include <iostream>
#include <sstream>
#include "craigsapp-midifile/MidiFile.h"

int main()
{
    FILE* fp;
    _wfopen_s(&fp,L"МИДИ.mid",L"rb");
    fseek(fp,SEEK_END);
    long fsize = ftell(fp);
    fseek(fp,SEEK_SET);

    std::string str(fsize,'*');

    for (int i = 0; i < str.size(); ++i) 
        str[i] = (char)getc(fp);
    fclose(fp);

    std::stringstream binarydata;
    binarydata << str;

    smf::MidiFile mf;
    if (mf.read(binarydata)) 
        std::cout << "midi read success!" << std::endl;

    return 0;
}