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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

2回答

5105閲覧

C/C++でユーザから受け取ったパスのファイルを開く

ryo00

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

1クリップ

投稿2017/07/02 13:55

###前提・実現したいこと
ユーザからファイルパスを受け取り、そのパスをもとにファイルを開きたいんです。

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

エラーメッセージ:
std::string" から "const char *" への適切な変換関数が存在しません

ユーザから受け取ったパスの型はstring型で、fopen_s関数の第二引数の型はsonst charで型の変換がうまくできていないというエラーなんですが、これは、どのような対処法がありますか?

###該当のソースコード

cpp

1string fpath; // ファイルパス保管 2cin >> fpath; // パス入力 3 4FILE *fp = (FILE *)malloc(sizeof(FILE)); // 変数宣言&メモリ確保 5 6errno_t fopen_err = fopen_s(&fp, fpath, "rb"); // ファイルを開く

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

折角、C++を使うのであれば、使い勝手のよいfstreamを使うと楽ですよ。

それに、C++にはC言語にはなかった例外があるので、newやファイル・オープンはメモリ/リソース・リークし易いです。メモリは成るべくstd::unique_ptr等のスマート・ポインタを使い、ファイルは成るべくfstreamを適切に使うのが安全です。

C++

1#include <iostream> 2#include <fstream> 3using namespace std; 4 5int main() 6{ 7 string fpath; // ファイルパス保管 8 cin >> fpath; // パス入力 9 10 // ファイルをバイナリモードで読み出しオープン 11 ifstream ifs(fpath, ifstream::binary); 12 13 // int型を1つ読み込んでみる 14 int temp; 15 ifs >> temp; 16}

ローカル変数ifsのスコープ(上記の場合、main関数)から抜ける時、自動的にファイルがクローズされます。

投稿2017/07/02 15:23

Chironian

総合スコア23272

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

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

ryo00

2017/07/02 15:52

使い勝手のよいfstreamを使うと楽ですよ。 とあるのですが、fstream?ifstreamですか?
Chironian

2017/07/02 16:00

fstreamはヘッダ名でもあり、入出力両方の機能を持つファイル・ストリーム名でもあります。 入力と出力のどちらかしか使わない時は、ifstreamやofstreamなどを使います。
episteme

2017/07/03 00:48

注意: 旧い処理系だと fstreamがstringを食ってくれないことがあります。 # そんときゃ string::c_str() で const char* に変換。
Chironian

2017/07/03 02:13

epistemeさん、フォローありがとうございます。 調べたらC++98でもまだstringを受け取るコンストラクタがないんですね。 まだまだC++11対応していないコンパイラを使っている人も少なくないようですし、要注意でした。
ryo00

2017/07/03 16:12

ありがとうございます。
guest

0

C言語の関数にC++のstd::stringで文字列を渡したい時は、.c_str()でNULL終端の文字配列のポインタを渡して上げる必要があります。

basic_string::c_str

投稿2017/07/02 14:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ryo00

2017/07/03 16:13

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問