複数の問題:
まず、あなたの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;
}
は注意してください。
第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; ' –
もう一つの問題:' std :: ifstream :: open'は 'std :: string'ではなく' char * 'を必要とします。 'std :: string :: c_str()'を使ってください。 –
@Thomas、良いキャッチ:明らかに、GCCは 'std :: ifstream :: open(std :: string)'を受け入れるため気付かなかった。私はそれが拡張だと思います。 –