프로그래밍 언어/C++

전체 ASCII 파일을 C ++ std :: string [duplicate]로 읽기

Rateye 2021. 6. 14. 10:21
728x90
반응형
질문 : 전체 ASCII 파일을 C ++ std :: string [duplicate]로 읽기

전체 파일을 메모리로 읽어서 C ++ std::string 에 배치해야합니다.

char[] 로 읽으면 대답은 매우 간단합니다.

std::ifstream t;
int length;
t.open("file.txt");      // open input file
t.seekg(0, std::ios::end);    // go to the end
length = t.tellg();           // report location (this is the length)
t.seekg(0, std::ios::beg);    // go back to the beginning
buffer = new char[length];    // allocate memory for a buffer of appropriate dimension
t.read(buffer, length);       // read the whole file into the buffer
t.close();                    // close file handle

// ... Do stuff with buffer here ...

이제 똑같은 일을하고 싶지만 char[] 대신 std::string 사용합니다. 루프를 피하고 싶습니다. 즉, 다음을 원하지 않습니다.

std::ifstream t;
t.open("file.txt");
std::string buffer;
std::string line;
while(t){
std::getline(t, line);
// ... Append line to buffer and go on
}
t.close()

어떤 아이디어?

답변

업데이트 : 이 방법은 STL 관용구를 잘 따르지만 실제로는 놀랍도록 비효율적입니다! 대용량 파일에는이 작업을 수행하지 마십시오. (참조 : http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html )

파일에서 streambuf 반복자를 만들고이를 사용하여 문자열을 초기화 할 수 있습니다.

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());

t.open("file.txt", "r") 구문을 어디서 얻었는지 확실하지 않습니다. 내가 아는 한 그것은 std::ifstream 있는 방법이 아닙니다. fopen 과 혼동 한 것 같습니다.

편집 : 또한 문자열 생성자에 대한 첫 번째 인수를 둘러싼 추가 괄호에 유의하십시오. 이것들은 필수적 입니다. 그들은 "가장 성가신 구문 분석 "으로 알려진 문제를 방지합니다.이 경우 실제로는 보통처럼 컴파일 오류가 발생하지는 않지만 흥미로운 (읽기 : 잘못된) 결과를 제공합니다.

주석에서 KeithB의 요점에 따라 모든 메모리를 미리 할당하는 방법이 있습니다 (문자열 클래스의 자동 재 할당에 의존하는 대신).

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str;

t.seekg(0, std::ios::end);   
str.reserve(t.tellg());
t.seekg(0, std::ios::beg);

str.assign((std::istreambuf_iterator<char>(t)),
            std::istreambuf_iterator<char>());
출처 : https://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring
728x90
반응형