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
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C ++에서 클래스와 구조체 사용시기 (0) | 2021.06.15 |
---|---|
C / C ++에서 "->"연산자가 의미하는 것 (0) | 2021.06.15 |
문자열에 C ++의 문자열이 포함되어 있는지 확인 (0) | 2021.06.14 |
.CPP 파일에 C ++ 템플릿 함수 정의 저장 (0) | 2021.06.12 |
C ++에서 POD 유형이란? (0) | 2021.06.12 |