问题描述
我正在使用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_type
为wchar_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;
}