質問: fgetc(fp); printf("%X ", ch); } while (!feof(fp)); fclose(fp); } } ``` というコードを書いたんですが、`fopen_s(&fp, "file.pbm", "rb"); // ファイルを開く`という所でユーザから与えられた、`fpath`(ファイルパス)を与えたく `fopen_s(&fp, fpath, "rb");` とすると > > "std::string" から "const char *" への適切な変換関数が存在しません > > > というエラーが発生します。 これはどう対処するべきなんですか?
回答: コメントにも書きましたがC言語とC++言語を区別して考える必要があります。C++言語の`std::string`をC言語の`fopen_s`に渡したために齟齬が生じています。ここでC++言語でファイルを扱う型としては`std::ifstream`が用意されており、そのコンストラクタには > > > ``` > basic_ifstream( const char* filename, std::ios_base::openmode mode ); > basic_ifstream( const std::string& filename, std::ios_base::openmode mode ); > > ``` > > と`std::string`を扱うものも用意されているため悩む必要がなくなります。 C++言語で記述した場合は次のようになります。 ``` #include #include #include int main() { std::string fpath; std::cout << "ファイルをドロップしてください。" << std::endl; std::cin >> fpath; if (!fpath.empty()) { std::cout << "ファイルを受け取りました。" << std::endl; std::ifstream fin{ fpath, std::ios::binary }; if (!fin.is_open()) return 1; int ch; while (std::ifstream::traits_type::not_eof(ch = fin.get())) std::cout << std::hex << std::uppercase << ch << ' '; } return 0; } ``` またC言語で記述した場合は次のようになります。 ``` #include #include int main() { char fpath[1024]; printf("ファイルをドロップしてください。\n"); scanf_s("%s", fpath, 1024); if (strcmp(fpath, "") != 0) { printf("ファイルを受け取りました。\n"); FILE *fp; int ch; errno_t e = fopen_s(&fp, fpath, "rb"); if (e != 0) return 1; while ((ch = fgetc(fp)) != EOF) printf("%X ", ch); fclose(fp); } return 0; } ```