私が書いているときcout<< Read("filepath")
、同じ文字の奇妙なセットが得られます。コードは以下のとおりです。
char* Read(std::string FilePath)
{
char* Buffer;
ifstream F_S(FilePath);
while (! F_S.eof())
{
F_S.getline(Buffer,100);
return Buffer;
}
}
私が書いているときcout<< Read("filepath")
、同じ文字の奇妙なセットが得られます。コードは以下のとおりです。
char* Read(std::string FilePath)
{
char* Buffer;
ifstream F_S(FilePath);
while (! F_S.eof())
{
F_S.getline(Buffer,100);
return Buffer;
}
}
ここに複数の問題があります:
まず、return
ステートメントはwhile
ループ内にあります。これは、ループが 1 回だけ実行され、関数から戻ることを意味します。ステートメントはループの外側return
に配置する必要があります。while
第 2 に、ストレージを割り当てませんBuffer
。あなたがすることはchar*
、初期化さえされていないポインターを宣言することだけです。入力を格納する場所があるように、ストレージを明示的に割り当てる必要がありifstream::getline
ます。を使用new
してストレージを割り当てることができますが、Read
関数はポインターを返すためchar*
、呼び出し元の関数はメモリを手動で管理する必要があり、これは通常は頭痛の種です。
より良い解決策は、 free 関数を使用することです。これにはstd::getline
がstd::string
必要なため、ストレージの割り当てについて心配する必要はありません。Read
また、を返すようにの関数シグネチャを変更する必要がありますstd::string
。
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;
}
改行をファイルに保持したい場合は、区切り文字を破棄するresult
ため、反復ごとに手動で追加する必要があることに注意してください。std::getline
このように読み取りを定義できます。
#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;
}