#pragma once
#include <Windows.h>
#include <tchar.h>
#include <string>
#include <vector>
#include <system_error>
#include <fstream>
// マルチバイト文字列をワイド文字列(UNICODE)に変換
std::wstring Multi2Wide(std::string const& src)
{
auto const dest_size = ::MultiByteToWideChar(CP_ACP, 0U, src.data(), -1, nullptr, 0U);
std::vector<wchar_t> dest(dest_size, L'\0');
if (::MultiByteToWideChar(CP_ACP, 0U, src.data(), -1, dest.data(), (int)dest.size()) == 0) {
throw std::system_error{ static_cast<int>(::GetLastError()), std::system_category() };
}
dest.resize(std::char_traits<wchar_t>::length(dest.data()));
dest.shrink_to_fit();
return std::wstring(dest.begin(), dest.end());
}
// 書式付きデバッグ出力
int DebugPrintf(LPCTSTR format, ...)
{
va_list args;
va_start(args, format);
int len = _vsctprintf(format, args) + 1;
TCHAR* buf = (TCHAR*)malloc(len * sizeof(TCHAR));
len = _vstprintf_s(buf, len, format, args);
OutputDebugString(buf);
free(buf);
return len;
}
bool ReadTable(const std::string& filename, std::vector<std::vector<std::string>>& table, const char delimiter = ',')
{
// ファイルを開く
std::fstream filestream(filename);
if (!filestream.is_open()) return false; // ファイルが開けなかった場合は終了
// ファイルを読み込む
while (!filestream.eof()) {
// 1行読み込む
std::string buffer;
filestream >> buffer;
// ファイルから読み込んだ1行の文字列を区切り文字で分けてリストに追加する
std::vector<std::string> record; // 1行分の文字列のリスト
std::istringstream streambuffer(buffer); // 文字列ストリーム
std::string token; // 1セル分の文字列
while (std::getline(streambuffer, token, delimiter)) {
// 1セル分の文字列をリストに追加する
record.push_back(token);
}
// 1行分の文字列を出力引数のリストに追加する
table.push_back(record);
}
return true;
}