C ++の文字列にファイルを読み込むためのワンライナーはありますか?
-
02-07-2019 - |
質問
標準C ++のファイルから文字列をすばやく簡単に取得する方法が必要です。私は自分で書くことができますが、C ++で既に標準的な方法があるかどうかを知りたいだけです。
Cocoaを知っている場合はこれと同等:
NSString *string = [NSString stringWithContentsOfFile:file];
解決
それはできますが、長い行です:
#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;
}
編集済み:&quot; istreambuf_iterator&quot;を使用します&quot; istream_iterator&quot;の代わりに
他のヒント
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に感謝します)。
標準C ++ライブラリには、これを行うための関数がありません。
できることは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());
方法:
#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;
}
次のように実行すると(ただし、以下とは異なり適切にラップされます)、ファイル内の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()することによるものでした。したがって、この投稿は無視してください。
std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;
短い行や単一の文の行ではありませんが、1行であり、それほど悪くはありません。