문제

표준 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;

그것은 짧거나 단일 진술 라인은 아니지만 한 줄이며 실제로 그렇게 나쁘지는 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top