質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6376閲覧

"std::string" から "LPCWSTR" への適切な変換について(変数による音楽ファイルのファイル名指定法について)

nameless_mob

総合スコア36

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/06/05 00:36

前提・実現したいこと

C++で音楽ファイルをランダムに再生していくプログラムを作っています。
乱数を入れた変数.wavをファイル名として指定したいです。
出来たらPlaySound関数のSND_RESOURCEの方で解決してくださるとよりありがたいですが、解決すればSND_FILENAMEのままでも構いません。

発生している問題・エラーメッセージ

ファイル名の指定がうまくいきません。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0413 "std::string" から "LPCWSTR" への適切な変換関数が存在しません 人を不安にさせる音楽制作ツール e:\作業中\人を不安にさせる音楽制作ツール\人を不安にさせる音楽制作ツール\人を不安にさせる音楽制作ツール\Source.cpp 29 エラー C2664 'BOOL PlaySoundW(LPCWSTR,HMODULE,DWORD)': 引数 1 を 'std::string' から 'LPCWSTR' へ変換できません。 人を不安にさせる音楽制作ツール e:\作業中\人を不安にさせる音楽制作ツール\人を不安にさせる音楽制作ツール\人を不安にさせる音楽制作ツール\source.cpp 28

該当のソースコード

C++

1#include<iostream> 2#include<random> 3#include<ctime> 4#include<string> 5#include<windows.h> 6#include<mmsystem.h> 7#include<conio.h> 8#pragma comment(lib,"winmm.lib") 9 10using namespace std; 11 12int main(void) { 13 14 srand((unsigned int)time(NULL)); 15 16 int random = 0; 17 const int fnum = 13; 18 19 while (_kbhit()) { 20 random = rand() % fnum; 21 22 string Lfname = "%02d.wav", random; 23 24 //"std::string"から"LPCWSTR"へ変換できない 25// PlaySound(fname, NULL, SND_FILENAME | SND_SYNC); 26 27 //Lfnameが定義されていない 28 //変数名をLfnameに変更すると"std::string"から"LPCWSTR"へ変換できないと言われる 29 PlaySound(TEXT(fname), NULL, SND_FILENAME | SND_SYNC); 30 31 } 32 33 return 0; 34}

試したこと

プロパティの変更からマルチバイト文字に変更:項目が見当たらない
TEXT(fname) : Lfnameが定義されていない
変数名をLfnameに : 最初のエラー("std::string"から"LPCWSTR"へ変換できない)が出る

直値でファイルネームを指定 : 正常に音が鳴る

リソースファイルにして解決しようともしたのですが、インスタンスハンドルもわからないので疑問点が増えただけでした。

補足情報(FW/ツールのバージョンなど)

Visual studio 2017 無料版
.NET Framework

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

std::stringはchar型文字列を管理するクラスです。
TEXTマクロは文字列定数を使用している文字列形式へ変換するものです。(単にLをつけたりつけなかったり)
つまり、TEXTマクロで、std::string型の文字列形式を変換することはできません。

また、 string Lfname = "%02d.wav", random;でやりたい気持ちは伝わってくるのですが、その意図通りには解釈してくれません。std::string型Lfname変数を定義して"02d.wav"で初期化し、std::string型random変数を定義するだけです。C/C++の文法ではそのようになります。

以下の方法でLfnameに"1.wav"のような文字列が設定されます。

C++

1#include <sstream> 2: 3std::stringstream ss; 4ss << random << ".wav"; 5std::string Lfname = ss.str();

また、TEXTの使用をやめ、プロジェクトのプロパティ → 構成(C)を「全ての構成」とし、そのまま全般 → 文字セットを「マルチ バイト文字セットを使用する」とするとビルドできるようになると思います。

C++

1PlaySound(Lfname.c_str(), NULL, SND_FILENAME | SND_SYNC);

ところで、もしかして、LfnameのLは、L"あいうえお"のLのつもりでしょうか?
単に変数名の一部に過ぎませんので、L"あいうえお"のLの役割は果たしません。


ちなみに、上記はchar型(マルチバイト文字)基準で対応する方式です。マルチプラットフォーム対応する時に向いている方法です。
Windowsだけ対応の場合は、ワイド文字(UTF-16)を用いる方が主流です。std::stringではなくstd::wstringを使えばできると思いますが、私は慣れないので具体的な方法はパスします。

投稿2018/06/05 02:01

編集2018/06/05 02:03
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nameless_mob

2018/06/05 04:14 編集

なるほど、TEXTマクロは文字列定数用なのですね。 上のやり方でやってみたところ、 std::stringstream ss; のssのところで不完全な型は使用できません、といったエラーが出てきてしまいました…。 Lfnameに関してはその通りです。エラーが変わったので一応記載してみたのですが…。
Chironian

2018/06/05 04:17

#include <sstream>を忘れているということはないでしょうか?
nameless_mob

2018/06/05 04:35

申し訳ございません、その通りです。インクルードしていませんでした・・・。
nameless_mob

2018/06/05 05:07

これは結合の際に0を頭に付加することは可能でしょうか。 できなくてもファイル名を直せばよいのですが…。
nameless_mob

2018/06/05 05:37

すみません、解決しました。 #include<iomanip> の setfill('0') << setw(2) を付ければよかったのですね。
Chironian

2018/06/05 05:48

自力解決、おめでとうございます。その内容でOKです!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問