-1

私が書いているとき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; 

    }
}
4

2 に答える 2

3

ここに複数の問題があります:

まず、returnステートメントはwhileループ内にあります。これは、ループが 1 回だけ実行され、関数から戻ることを意味します。ステートメントはループの外側returnに配置する必要があります。while

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

より良い解決策は、 free 関数を使用することです。これにはstd::getlinestd::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

于 2012-04-18T19:33:47.960 に答える
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;

}
于 2012-04-19T08:21:30.903 に答える