2012-04-18 16 views

答えて

3

複数の問題:

まず、あなたのreturn文はループが一度だけ実行され、その後、あなただけの関数から戻ります意味あなたwhileループ、内側にあります。 returnステートメントは、の外側に、whileループのの外側に配置する必要があります。

第2に、Bufferのストレージを割り当てないでください。あなたがしているのは、char*ポインタを宣言することだけです。ポインタは初期化されていません。 ifstream::getlineが入力を格納する場所を持つように、明示的にストレージを割り当てる必要があります。 newを使用して記憶域を割り当てることができますが、Read関数がchar*ポインタを返すため、呼び出し関数はメモリを手動で管理する必要があります。これは一般的に頭痛です。

無料の機能std::getlineを使用することをお勧めします。std::stringが必要なので、ストレージの割り当てについて心配する必要はありません。また、std::stringを返すように、関数の署名をReadに変更する必要があります。あなたがファイルにキャリッジリターンを保存したい場合は、手動で文字区切りstd::getline破棄するので、各反復内resultにそれらを追加する必要がありますことを

std::string Read(std::string FilePath) 
{ 
    std::ifstream F_S(FilePath.c_str()); 
    /* You should also check for `F_S.good()` here */ 

    std::string result, Buffer; 
    while(std::getline(F_S, Buffer)) 
    { 
     result += Buffer; 
    } 

    return result; 
} 

は注意してください。

+1

第3の問題。 [*決して* .eof()をループ条件として使用する](http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line)。また、提案されたソリューションは最後に読み込まれた行だけを返します。試してください: 'std :: string result、Buffer; while(std :: getline(F_S、Buffer))result + =バッファ; return result; ' –

+0

もう一つの問題:' std :: ifstream :: open'は 'std :: string'ではなく' char * 'を必要とします。 'std :: string :: c_str()'を使ってください。 –

+0

@Thomas、良いキャッチ:明らかに、GCCは 'std :: ifstream :: open(std :: string)'を受け入れるため気付かなかった。私はそれが拡張だと思います。 –

0

このようにあなたの読書を定義することができます。

#include <string> 
#include <fstream> 
#include <iostream> 
using namespace std; 

string& Read(string file_path) 
{ 
    ifstream infile(file_path.c_str(), ios::in); 
    string result = ""; 
    string line = ""; 
    while (getline(infile, line)) 
    { 
     result.append(line); //also you can use result+=line, but append is faster than += 
    } 

    return result; 

} 
+0

[匿名ユーザーが注目した](http://stackoverflow.com/suggested-edits/247435)、ここで参照を返すのは間違っている可能性があります。スタック上に存在しなくなる一時的な文字列への参照になります関数の外側にある。代わりに 'std :: string'を返すべきです。 – Rup

+0

また、 'result.append()'が 'result + = line'よりも速いのはなぜですか?私は実装がまったく同じであると思います! – Rup

関連する問題