C ++의 문자열로 파일로 읽을 원 라이너가 있습니까?
-
02-07-2019 - |
문제
표준 C ++의 파일에서 문자열을 얻을 수있는 빠른 방법이 필요합니다. 나는 내 자신의 글을 쓸 수 있지만 C ++에 이미 표준 방식이 있는지 알고 싶습니다.
코코아를 알고 있다면 이것에 해당합니다.
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;
}
편집 : "istream_iterator"대신 "istreambuf_iterator"를 사용합니다.
다른 팁
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));
}
편집 - 중간 문자열 스트림을 제거하고 이제는 문자열로 바로 복사하고 이제는 흰색 부프 _iterator를 사용하여 공백을 무시합니다 (주석에 감사드립니다).
표준 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-liner는 아닙니다.
편집 : 0x1a는 ios_base :: binary가 그것을 다루기 때문에 좋은 예는 아닙니다. 그러나 C ++ 스트림조차도 .read ()를 사용하여 PNG 파일을 한 번에 읽을 때 종종 문제를 일으 킵니다. C Way를 사용하는 것이 더 좋습니다. 이유를 보여주는 좋은 예를 기억할 수 없습니다. 아마도 .read ()가 루프의 블록에 바이너리 파일을 in을 사용하여 C ++ 스트림에 문제가 될 수 있습니다. 따라서이 게시물을 무시하십시오.
std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;
그것은 짧거나 단일 진술 라인은 아니지만 한 줄이며 실제로 그렇게 나쁘지는 않습니다.