8

標準 C++ でファイルから文字列をすばやく簡単に取得する方法が必要です。私は自分で書くことができますが、C++ で標準的な方法が既にあるかどうかを知りたいだけです。

Cocoa を知っている場合は、これに相当します。

NSString *string = [NSString stringWithContentsOfFile:file];
4

7 に答える 7

17

私たちはそれを行うことができますが、それは長い列です:

#include<fstream>
#include<iostream>
#include<iterator>
#include<string>

using namespace std;

int main()
{
    // The one-liner
    string fileContents(istreambuf_iterator<char>(ifstream("filename.txt")), istreambuf_iterator<char>());

    // Check result
    cout << fileContents;
}

編集済み:「istream_iterator」の代わりに「istreambuf_iterator」を使用

于 2008-09-26T00:31:17.543 に答える
11

istream_iteratorでほぼ可能です(3行!)

#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    ifstream file("filename.txt");
    string fileContents;

    copy(istreambuf_iterator<char>(file),
              istreambuf_iterator<char>(),
              back_inserter(fileContents));
}

編集済み-中間の文字列ストリームを削除し、文字列に直接コピーし、空白を無視するistreambuf_iteratorを使用するようになりました(コメントを寄せてくれたMartin Yorkに感謝します)。

于 2008-09-25T23:00:44.703 に答える
3

標準C++ライブラリは、これを行うための関数を提供していません。

于 2008-09-25T22:54:23.267 に答える
2

どうですか:

#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

int main( void )
{
  stringstream os(stringstream::out);
  os << ifstream("filename.txt").rdbuf();
  string s(os.str());
  cout << s << endl;
}
于 2008-09-25T23:34:59.940 に答える
2

私にできる最善のことは5行です:

#include <fstream>
#include <vector>
using namespace std;

ifstream f("filename.txt");
f.seekg(0, ios::end);
vector<char> buffer(f.tellg());
f.seekg(0, ios::beg);
f.read(&buffer[0], buffer.size());
于 2008-09-25T23:00:11.943 に答える
0
std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;

短い行や単一のステートメントの行ではありませんが、1行であり、それほど悪くはありません。

于 2010-08-30T10:51:11.310 に答える
0

次のようにすると(ただし、以下とは異なり、適切にラップされます)、ファイル内の0x1Aバイトを気にせずにファイルを読み取ることができます(たとえば、ファイルの読み取りが短くなります)。以前に提案された方法は、ファイル内の0x1A(たとえば)でチョークします。


#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
using namespace std;

int main() {
    FILE* in = fopen("filename.txt", "rb");
    if (in == NULL) {
        return EXIT_FAILURE;
    }
    if (fseek(in, 0, SEEK_END) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    const long filesize = ftell(in);
    if (filesize == -1) {
        fclose(in);
        return EXIT_FAILURE;
    }
    vector<unsigned char> buffer(filesize);
    if (fseek(in, 0, SEEK_SET) != 0 || fread(&buffer[0], sizeof(buffer[0]), buffer.size(), in) != buffer.size() || ferror(in) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    fclose(in);
}

しかし、ええ、それはすでに実装されている1ライナーではありません。

編集:ios_base :: binaryがそれをカバーするので、0x1Aは良い例ではありませんでした。ただし、それでも、C ++ストリームでは、.read()を使用してpngファイルを一度に読み取るときに問題が発生することがよくあります。Cの方法を使用するとうまくいきます。理由を示す良い例を思い出せません。おそらく、C ++ストリームで問題になる可能性があるのは、ループ内のブロックでバイナリファイルを.read()することでした。したがって、この投稿は無視してください。

于 2008-09-26T00:24:08.420 に答える