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

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

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

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

Q&A

解決済

2回答

2066閲覧

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

nqf27650

総合スコア115

C++

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

0グッド

0クリップ

投稿2017/04/25 12:26

既に紹介頂きました、下記の添付ファイルのDebugを行っています。

Q1)下記のファイルをDebugする為には、init.cppなるファイルを
同じDirに作成する必要がありますか?
Q2)その場合には、init.cppの内容は?
Q3)fileName.c_str()について説明して頂ければ有りがたいです。

#include <fstream>
#include <string>

class FileReader {
private:
std::ifstream fin;
public:
const std::string FILE_NAME;
FileReader(const std::string& fileName);
std::string* readLine();
};

// 初期化リストを使用
FileReader::FileReader(const std::string& fileName)
: fin(fileName.c_str()), FILE_NAME(fileName) {
}

std::string* FileReader::readLine() {
if (fin.eof()) return 0;

std::string lineStr; std::getline(fin, lineStr); return new std::string(lineStr);

}

#include <iostream>

int main() {
FileReader in("init.cpp");

std::cout << "file name: " << in.FILE_NAME << std::endl; std::cout << std::endl; // このへんがJava風 std::string* line; while ((line = in.readLine()) != 0) { std::cout << *line << std::endl; delete line; }

}
以上宜しくお願いします

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

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

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

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

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

guest

回答2

0

こんにちは。

まず、苦言ですいません。質問欄の上の方にある、<code>を押すと'''のような行が2行でてきます。その間にソース・コードをコピペして下さい。
そうすると見やすいソースになります。

さて、init.cppは「カレント・フォルダ」におく必要があります。
例えば、Windowsでexplorerからexeを叩いて起動した場合は、そのexeのあるフォルダです。linuxも同様ですね。

init.cppの内容を単に表示しているだけのようですので、init.cppは普通にテキストなら中身はなんでも良いです。でも、漢字が入っているとややこしいので漢字は使わない方がよいとかも知れません。

ところで、readLie()の仕様がひっかかります。
newを使わないで済むのにnewを使うとお尻がムズムズしてしいます。
気になるので修正してみました。(ついでに1つバグだろう点を修正してます。init.cppが無い時、無限ループしてました。)

ちなみに'''の間にソースをコピペすると下のようになります。

C++

1#include <fstream> 2#include <string> 3 4class FileReader 5{ 6private: 7 std::ifstream fin; 8 std::string lineStr; 9public: 10 const std::string FILE_NAME; 11 FileReader(const std::string& fileName); 12 std::string* readLine(); 13}; 14 15// 初期化リストを使用 16FileReader::FileReader(const std::string& fileName) : 17 fin(fileName.c_str()), 18 FILE_NAME(fileName) 19{ 20} 21 22std::string* FileReader::readLine() 23{ 24 if (!fin) return NULL; 25 26 std::getline(fin, lineStr); 27 return &lineStr; 28} 29 30#include <iostream> 31 32int main() 33{ 34 FileReader in("init.cpp"); 35 36 std::cout << "file name: " << in.FILE_NAME << std::endl; 37 std::cout << std::endl; 38 39 // このへんがJava風 40 std::string* line; 41 while ((line = in.readLine())) 42 { 43 std::cout << *line << std::endl; 44 } 45}

Q3への回答を忘れてました。
std::stringのc_str()メンバ関数は、C言語文字列を返却します。
古いC++のstd::fstreamのコンストラクタはC言語文字列しか受け取りませんので、変換して与えています。
最近(といっても2011年頃からなので、もういい加減古いですが)のC++はstd::stringも受け取ります。C++11仕様でビルドすれば変換する必要はないです。

投稿2017/04/25 13:27

編集2017/04/25 13:34
Chironian

総合スコア23272

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

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

nqf27650

2017/04/26 04:37

毎度お世話になります 1)<code>を押すと'''のような行が2...は未だ良き判りませんが、後からやってみます 2)c_str()についても、テストしてみます。 3)改良後のコードとオリジナルコードの差  オリジナルコードは、initファイルな中の行ごとの明細が表示されていましたが、  改良コードでは、その表示が無いようです。  
Chironian

2017/04/26 06:30

「行ごとの明細」の意味が分かりませんが、私のところでは改造前も後も同じ出力でした。MinGW 5.3.0でビルドしてます。
majiponi

2017/04/26 08:35

C++11のコンストラクタ追加は知りませんでした、勉強になります。 (リファレンス読みながら書いたはずなのに…>△<)
nqf27650

2017/04/26 13:21

毎度お世話になります。 行ごとの明細とは、initi.cppの内容が string "aaa" string "bbb" int  123456 ならば、プログラムの出力も、同じ様に string "aaa" string "bbb" int  123456 と表示する事ですが、この表示が無いようでした。 御免なさい、些細な質問をしまして。
Chironian

2017/04/26 13:49

こちらでは出てます。 何かが違うのでしょうが、ご質問の主旨とは異なりますので、ほっておきましょう。
guest

0

ベストアンサー

A1) なくてもよい。というよりも、ない場合もデバッグすべき。
同じディレクトリではなく、プログラムのカレントディレクトリに作ればよい。
A2) なんでもよい。バイナリでも可。
A3) fstreamは、const char型の引数でファイル名を受け取ります。stringオブジェクトそのままではなく、c_strメソッドでconst char型に変換しています。

投稿2017/04/25 13:13

majiponi

総合スコア1720

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

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

nqf27650

2017/04/25 23:13

毎度お世話になります。 >A3) fstreamは、const char*型の引数でファイル名を受け取ります。stringオブジェクトそのままではなく、c_strメソッドでconst char*型に変換しています。 <ーーココらへんが、すっきりしないところで、質問したところです。 つまり、変換しなくても、済むと考えても宜しいでしょうか? 後で、テストしてみます。 以上
majiponi

2017/04/26 08:22

変換しないと渡せない。stringを直接受け取れないから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問