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

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

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

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

Q&A

解決済

1回答

1266閲覧

iniファイルから取得したファイルパスが化ける

ginger893

総合スコア13

C++

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

0グッド

1クリップ

投稿2019/04/15 10:40

編集2019/04/16 03:19

前提・実現したいこと

  • 前提:

前任者と連絡が取れない状況で、ハードコードされているパスを可変に変更する必要がある。

  • 実現したいこと:

C++のソースにハードコードされているフォルダパス(の一部)をiniファイルから取得した値に差替えたい。

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

ハードコードされているパスを出力すると、

C:/ProgramData/HOGE/TMP/Output/

と出力されるが、iniファイルから取得した値に差替えて出力すると、

ンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンン

と出力される。

該当のソースコード

ConsoleApplication.cpp

C++

1#include "stdafx.h" 2#include <string> 3#include <iostream> 4 5#include "Header1.h" 6 7int main() 8{ 9 // 元からあるファイルパスを出力 10 std::cout << HOGE_TMP_OUT_OLD << std::endl; 11 12 //今回追加したファイルパスを出力 13 std::cout << HOGE_TMP_OUT_NEW << std::endl; 14 15 return 1; 16}

Header1.h

C++

1#include "stdafx.h" 2#include <string> 3#include <Windows.h> 4 5std::string GetBaseFolderPath() 6{ 7 //「setting.ini」から「section1」セクションの「key1」キーに 8 // 設定された値を取得する(「C:/ProgramData/HOGE/TMP」を取得する想定) 9 LPCSTR lpAppName = "section1"; 10 LPCSTR lpKeyName = "key1"; 11 LPCSTR lpDefault = ""; 12 char charBuffer[256]; 13 LPCSTR lpConfigFilePath = ".\setting.ini"; 14 15 GetPrivateProfileStringA(lpAppName, lpKeyName, lpDefault, charBuffer, sizeof(charBuffer), lpConfigFilePath); 16 17 return std::string(charBuffer); 18} 19 20//今回追加したファイルパス 21static const char* HOGE_TMP_OUT_NEW = (GetBaseFolderPath() + "/Output/").c_str(); 22 23// 元からあったファイルパス 24static const char* HOGE_TMP_OUT_OLD = "C:/ProgramData/HOGE/TMP/Output/";

setting.ini

ini

1[section1] 2key1=C:/ProgramData/HOGE/TMP

試したこと

  1. デバッガで「GetBaseFolderPath()」のreturn時に止めて、charBufferの内容を確認したところ、想定した値(「C:/ProgramData/HOGE/TMP」)だった

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

OS:Windows 7
ツール:Visual Studio Professional 2015

C++はやり始めて2週間程度なのでどこから調べたらいいのかがわかっておりません。
直前までJavaやMatlabを触っていたので、C++っぽくない記述がありましたら申し訳ありません。
どなたか回答していただけると幸いです。

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

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

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

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

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

cateye

2019/04/15 11:00 編集

>出力される。 出力先はコマンドプロンプトですか? また、iniファイルのエンコードはshift-jisですか?
ginger893

2019/04/16 00:06

出力先はコマンドプロンプトになります。 (実行後すぐ閉じてしまうため、mainのreturn 1;にブレークポイントを張って止めて確認しております) iniファイルのエンコードはShift-JISです。
guest

回答1

0

ベストアンサー

static const char* HOGE_TMP_OUT_NEW = (GetBaseFolderPath() + "/Output/").c_str();

stringが廃棄されてんじゃないかな。

static const std::string HOGE_TMP_OUT_NEW = GetBaseFolderPath() + "/Output/";

だったらどうなります?

投稿2019/04/15 11:19

episteme

総合スコア16614

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

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

ginger893

2019/04/16 00:50

>> episteme様 無事出力されました!ありがとうございます。 廃棄されないようにするにはどうすればいいか調べてみたいと思います。 >> majiponi様 リンクを附記していただきありがとうございます。 C++はこのような動きをするのですね。大変参考になりました。
episteme

2019/04/17 09:49 編集

> 廃棄されないようにするにはどうすればいいか調べてみたいと思います。 いや、(廃棄されてもいいように)廃棄されるまえに const std::string にコピーしたんだが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問