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

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

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

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

Q&A

6回答

1997閲覧

C++ ファイル名を指定して中身を自動で定義

ness

総合スコア7

C++

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

0グッド

0クリップ

投稿2017/01/17 05:39

編集2017/01/17 06:16

C++での質問です。

前提としてファイルがあり、
ファイル名が A
その中身に ab.mp4 ac.mp4 ad.mp4
が在るとします。

ファイル名のみを指定して
char* fileList[]={"ab.mp4","ac.mp4","ad.mp4"}
が自動で作られるコードは可能でしょうか。

もし可能ならば、サンプルコードをぜひお願いします。
または類型でも構いません。

====== 追記 =====
失礼しました。
ファイルではなく フォルダーです。
フォルダーの中にmp4のファイルが3つあるという状況です。

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

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

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

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

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

ness

2017/01/17 06:03

どのような切り口で調べたらいいかも判りません。
guest

回答6

0

こんにちは。

フォルダーの中にmp4のファイルが3つあるという状況です。

普通に作るとOSによってコードは全く異なります。
boost::filesystemを使えば、そこそこ同じコードで複数のOSに対応できます。

boostのほとんどのライブラリはヘッダのみインクルードすれば使えますが、filesystemは例外の1つなのでboostのビルドが必要になります。

投稿2017/01/17 06:23

Chironian

総合スコア23272

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

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

ness

2017/01/17 06:32

OSはwindows10 です。 上手く使えるか試してみます。ありがとうございました。
Chironian

2017/01/17 06:47

boostは準標準ライブラリ的な位置にあるライブラリですので、boostでできることはWindows APIを学習するよりboostを学習した方がためになるケースが多いと思います。 最初にビルドできるようになるのは少し苦労しますが、boostのビルド方法を解説しているサイトも多いですので頑張って下さい。 http://umezawa.dyndns.info/wordpress/?p=5781
PineMatsu

2017/01/17 08:17

横から失礼します。コンパイラーがVC++であるのならboost binaryにビルド済みのインストーラが有ります。VCのバージョンごとにインストーラが違うのでバージョンに合わせてダウンロードしてインストールすれば使えるようになります。アドレスは以下です。 https://sourceforge.net/projects/boost/files/boost-binaries/1.63.0/ なお、boostjpというサイトには詳しい日本語情報があります。 https://boostjp.github.io/
guest

0

**追記に対して:**C++ ファイル 一覧 取得 でググれば死ぬほど出てくるのでは…


んん…そんなコードをテンプレートにしたいって意味とは違うと思うので
※ファイル読み取って別のファイルにchar* fileList[]={"ab.mp4","ac.mp4","ad.mp4"} って書きたいわけじゃないですよね
ある文字列を複数の文字列に分割したいって意味に読み替えて言います。

std string split でググって出てくる回答がコレです。


訳)
文字列を指定した区切り文字で分割するにはこのようにしています。
最初の方は予め指定されたvectorに結果を格納し、2個目は新しいvectorを生成して結果を返します。

C++

1#include <string> 2#include <sstream> 3#include <vector> 4 5void split(const std::string &s, char delim, std::vector<std::string> &elems) { 6 std::stringstream ss; 7 ss.str(s); 8 std::string item; 9 while (std::getline(ss, item, delim)) { 10 elems.push_back(item); 11 } 12} 13 14 15std::vector<std::string> split(const std::string &s, char delim) { 16 std::vector<std::string> elems; 17 split(s, delim, elems); 18 return elems; 19}

注意点:
この解決方法では空のトークンをスキップしないので、以下のような場合空を含む4つの文字列を返します。

C++

1std::vector<std::string> x = split("one:two::three", ':');

他の回答も色々参考になると思います。
ストリームを直接分割する方法は無駄がない分高速ですしね。

使い方:
つまりこういう風にすれば…

C++

1std::vector<std::string> mp4s = split("ab.mp4 ac.mp4 ad.mp4", ' ');

3つの文字列の配列が得られます。
std::stringのメソッドc_str()を使えば文字列のポインタ(const char*)は得られますし、vectorに格納されるので要素数やイテレーションは簡単にかけます。
ファイルを文字列として読み取って、スプリットしましょう。

その他STLのことはググってください。

投稿2017/01/17 06:13

編集2017/01/17 06:18
haru666

総合スコア1591

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

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

ness

2017/01/17 06:29

検索内容が的外れだったみたいです。 その文言で再度検索します。ありがとうございました。
guest

0

憶測ですが...
テキストファイルの中に ab.mp4 などが書かれていて、それを文字列型の配列変数に代入したいということでしょうか?
サンプルは差し上げませんが(時間がない)
「正規表現」「正規構文」のライブラリが使えれば、テキストから特定の表現を引っこ抜くことが便利ですよ。

投稿2017/01/17 06:06

hsk

総合スコア728

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

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

ness

2017/01/17 06:07

ありがとうございます。 調べてみます。
ness

2017/01/17 06:19

申し訳ありません。 テキストファイルなどではなくフォルダーの中にあります。 質問文に誤字を追記しました。
guest

0

Visual Sudio 2015 でおためし(Boost不使用/Visual C++だけでコンパイルできるっす):
コマンドラインで指定したdir.のナカミを列挙する

C++

1#include <string> 2#include <iostream> 3#include <filesystem> 4 5using namespace std; 6using namespace std::experimental::filesystem::v1; // path, directory_iterator 7 8int main(int argc, char** argv) { 9 string dir = argc == 0 ? "." : argv[1]; 10 path p(dir); 11 if (!is_directory(p)) { 12 cout << "No such directory: " << dir << endl; 13 return 1; 14 } 15 for (const auto& entry : directory_iterator(p) ) { 16 if (is_regular_file(entry.status())) { 17 cout << " File: " << entry.path().filename() << endl; 18 } else if (is_directory(entry.status())) { 19 cout << " Dir: " << entry.path().filename() << endl; 20 } 21 } 22} 23

投稿2017/01/18 00:48

編集2017/01/18 00:52
episteme

総合スコア16614

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

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

0

フォルダー内のファイル列挙であれば例えば
C++言語でディレクトリ内のファイル一覧取得(windows編)
が参考になるかと思います。

投稿2017/01/17 08:31

PineMatsu

総合スコア3579

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

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

0

実現するロジックのヒントです。
ファイルAを開く
中身を読み込む
ファイルAを閉じる
中身をスペースで区切ってfilelistの配列に入れる
何かをする(させる)のを書くのがプログラムなので、プログラムの勉強中ならば
実現方法は自分で調べてみてください。

投稿2017/01/17 06:13

Take-y

総合スコア91

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問