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

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

ただいまの
回答率

90.76%

  • C++

    3245questions

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

  • Visual Studio

    1698questions

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

  • Win32 API

    206questions

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

  • VC++

    132questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

  • Visual C++

    109questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 189

nameless_mob

score 27

 前提・実現したいこと

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    

 該当のソースコード

#include<iostream>
#include<random>
#include<ctime>
#include<string>
#include<windows.h>
#include<mmsystem.h>
#include<conio.h>
#pragma comment(lib,"winmm.lib")

using namespace std;

int main(void) {

    srand((unsigned int)time(NULL));

    int random = 0;
    const int fnum = 13;

    while (_kbhit()) {
        random = rand() % fnum;

        string Lfname = "%02d.wav", random;

        //"std::string"から"LPCWSTR"へ変換できない
//        PlaySound(fname, NULL, SND_FILENAME | SND_SYNC);

        //Lfnameが定義されていない
        //変数名をLfnameに変更すると"std::string"から"LPCWSTR"へ変換できないと言われる
        PlaySound(TEXT(fname), NULL, SND_FILENAME | SND_SYNC);

    }

    return 0;
}

 試したこと

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

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

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

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

Visual studio 2017 無料版
.NET Framework

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

こんにちは。

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"のような文字列が設定されます。

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

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

PlaySound(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 13:11 編集

    なるほど、TEXTマクロは文字列定数用なのですね。
    上のやり方でやってみたところ、

    std::stringstream ss;

    のssのところで不完全な型は使用できません、といったエラーが出てきてしまいました…。

    Lfnameに関してはその通りです。エラーが変わったので一応記載してみたのですが…。

    キャンセル

  • 2018/06/05 13:17

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

    キャンセル

  • 2018/06/05 13:35

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

    キャンセル

  • 2018/06/05 14:07

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

    キャンセル

  • 2018/06/05 14:37

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

    キャンセル

  • 2018/06/05 14:48

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C++の初期化リストに関する質問

    既に紹介頂きました、下記の添付ファイルのDebugを行っています。 Q1)下記のファイルをDebugする為には、init.cppなるファイルを 同じDirに作成する必要があ

  • 解決済

    Raspberry piでOpenCVを利用したい

    前提・実現したいこと Raspberry pi 2でOpenCV(2.4.0)を利用できるように設定を行っているのですが、コンパイルでエラーが発生しました。 全くの初心者で解決方法

  • 受付中

    Ajax通信でCGIを使いJSONデータを操作したいです

    前提・実現したいこと AjaxでPOST関数を使い、C++で作成したCGIを呼び出し、JSONデータを取得したいです。 Ajaxからは JSONデータを送信しています。 そのため、

  • 解決済

    C++での文字列のシャッフルについて

    こんにちは。 C++でFisher–Yatesシャッフルアルゴルズムを使って、複数の文字列をシャッフルできるようにしたいです。 そこでいろいろ調べてみましたが、C++でかつ複数の文

  • 受付中

    C言語で、乱数で複数の重複しない2つの値をとりたいとき

    例えば「1」〜「10」までの要素の中から3つだけランダムに抽出したいときはどようなコードを書けばいいのですか?

  • 解決済

    文字が出力されない.

    発生している問題・エラーメッセージ str2が正しく出力されません。 1~3は同じ事を別の書き方でしているだけと考えていましたが、 str2が出力されないことからこの考え間違っ

  • 解決済

    C言語 ファイルからの読み取り

    大学の授業の課題で以下のような問題が出たのですが分かりません。C言語です。 ファイルから読み取る関数と出力する関数を分けたいです。 null 文字を除いて最大20文字を格納でき

  • 解決済

    c++ iniファイルで取得した文字列をMessageBeepメソッドの引数に指定したい

    C++でiniファイルの文字列を取得し、取得した文字列をMessageBeepメソッドの引数に指定したいです。 GetPrivateProfileStringメソッドを使って、in

同じタグがついた質問を見る

  • C++

    3245questions

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

  • Visual Studio

    1698questions

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

  • Win32 API

    206questions

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

  • VC++

    132questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

  • Visual C++

    109questions

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

  • トップ
  • C++に関する質問
  • "std::string" から "LPCWSTR" への適切な変換について(変数による音楽ファイルのファイル名指定法について)