C++에서 파일을 문자열로 읽기
-
istreambuf_iterator
를 사용하여 C++의 문자열로 파일 읽기 -
rdbuf
를 사용하여 C++에서 파일을 문자열로 읽기 -
fread
를 사용하여 파일을 문자열로 읽기 -
read
를 사용하여 파일을 문자열로 읽기
이 기사에서는 C++에서 파일 내용을std::string
으로 읽는 몇 가지 방법을 설명합니다.
istreambuf_iterator
를 사용하여 C++의 문자열로 파일 읽기
istreambuf_iterator
는std::basic_streambuf
객체에서 연속 문자를 읽는 입력 반복기입니다. 따라서 우리는ifstream
스트림과 함께istreambuf_iterator
를 활용하고 파일의 전체 내용을std::string
으로 읽을 수 있습니다.
처음에는 주어진 파일 경로를ifstream
객체로 엽니 다. 그런 다음istreambuf_iterator<char>(input_file)
을string
생성자에 전달하고 처음에 필요한 객체를 가져올 수 있습니다. 함수에서 반환 할string
생성자 문을 직접 전달하고 있습니다. 프로그램의 출력은filename
변수에 지정된 파일의 내용이어야합니다.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString(const string& path) {
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
return string((std::istreambuf_iterator<char>(input_file)),
std::istreambuf_iterator<char>());
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
rdbuf
를 사용하여 C++에서 파일을 문자열로 읽기
rdbuf
함수는 파일의 스트림 버퍼에 대한 포인터를 반환하는 내장 메서드로<<
연산자를 사용하여 파일의 전체 내용을 필요한 객체에 삽입하는 데 유용합니다.
다음 예제에서는rdbuf
함수의 반환 값을 삽입하는ostringstream
객체를 생성합니다. 함수 자체는string
객체를 반환하므로str
메서드가 최종 반환 값을 가져 오는 데 사용됩니다.
#include <fstream>
#include <iostream>
#include <sstream>
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;
string readFileIntoString2(const string& path) {
auto ss = ostringstream{};
ifstream input_file(path);
if (!input_file.is_open()) {
cerr << "Could not open the file - '" << path << "'" << endl;
exit(EXIT_FAILURE);
}
ss << input_file.rdbuf();
return ss.str();
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString2(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
fread
를 사용하여 파일을 문자열로 읽기
파일을 읽는 또 다른 방법은 C 표준 라이브러리 함수 fread
입니다. 이 방법은 최신 C++ 코드베이스에서 일반적이지 않은 비교적 레거시 함수가 필요하지만 이전 방법에 비해 상당한 속도 향상 성능을 제공합니다.
fread
는 4 개의 인수를 취합니다.
- 읽은 데이터가 저장되는 버퍼에 대한 포인터.
- 데이터 항목의 크기.
- 데이터 항목 수
- 읽을 파일 포인터.
전체 파일을 읽고 있으므로 파일 크기를 검색해야하며stat
Unix 시스템 호출로 구현됩니다. 파일 크기가 검색되면 해당 값을 데이터 요소의 크기로 fread
함수에 전달하고 데이터 항목 수로 1
을 지정합니다.
열린 파일은 파일 포인터의 유일한 인수를 취하는 fclose
함수 호출로 닫아야합니다.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString3(const string& path) {
struct stat sb {};
string res;
FILE* input_file = fopen(path.c_str(), "r");
if (input_file == nullptr) {
perror("fopen");
}
stat(path.c_str(), &sb);
res.resize(sb.st_size);
fread(const_cast<char*>(res.data()), sb.st_size, 1, input_file);
fclose(input_file);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString3(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
read
를 사용하여 파일을 문자열로 읽기
read
메소드는 다양한 운영 체제에서 사용할 수있는 POSIX 호환 함수 호출이며 프로그래머가이를 효율적으로 사용하는 것을 안다면 가장 유연한 방법이 될 수 있습니다. fread
자체가 read
라고 부르지 만 모든 경우에 더 빠른 작업을 보장하지는 않습니다. 여러 요소가 이러한 시스템 호출을 효율적으로 사용하는 데 도움이되기 때문입니다.
fread
와의 주요 차이점은read
는 데이터를 읽을 파일을 가리키는 파일 설명자 인수가 필요하다는 것입니다. 파일 설명자는 실행 중에 프로그램이 가질 수있는 열린 파일 스트림과 관련된 특수 정수입니다. open
함수 호출을 사용하여 획득하고 int
유형으로 저장할 수 있습니다. read
함수의 다른 두 인수는 데이터가 저장 될 버퍼에 대한 포인터와 읽어야하는 바이트 수이며, 후자는 fstat
함수 호출로 검색됩니다. 읽은 파일 내용을 저장하기 위해 버퍼로string.data
를 사용하고 있다는 점에 유의하십시오.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
string readFileIntoString4(const string& path) {
struct stat sb {};
string res;
int fd = open(path.c_str(), O_RDONLY);
if (fd < 0) {
perror("open\n");
}
fstat(fd, &sb);
res.resize(sb.st_size);
read(fd, (char*)(res.data()), sb.st_size);
close(fd);
return res;
}
int main() {
string filename("input.txt");
string file_contents;
file_contents = readFileIntoString4(filename);
cout << file_contents << endl;
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook