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

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

ただいまの
回答率

90.51%

  • C++

    4413questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 551

nqf27650

score -19

既に紹介頂きました、下記の添付ファイルの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;
}
}      
以上宜しくお願いします                                                   

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

こんにちは。

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

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

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

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

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

#include <fstream>
#include <string>

class FileReader
{
private:
    std::ifstream fin;
    std::string lineStr;
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) return NULL;

    std::getline(fin, lineStr); 
    return &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()))
    {
        std::cout << *line << std::endl;
    }
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/26 13:37

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

     

    キャンセル

  • 2017/04/26 15:30

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

    キャンセル

  • 2017/04/26 17:35

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

    キャンセル

  • 2017/04/26 22:21

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

    キャンセル

  • 2017/04/26 22:49

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

    キャンセル

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/26 08:13

    毎度お世話になります。
    >A3) fstreamは、const char*型の引数でファイル名を受け取ります。stringオブジェクトそのままではなく、c_strメソッドでconst char*型に変換しています。

    <ーーココらへんが、すっきりしないところで、質問したところです。
    つまり、変換しなくても、済むと考えても宜しいでしょうか?
    後で、テストしてみます。
    以上

    キャンセル

  • 2017/04/26 17:22

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

    キャンセル

同じタグがついた質問を見る

  • C++

    4413questions

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