C++에서 파일을 문자열로 읽기

Jinku Hu 2023년10월12일
  1. istreambuf_iterator를 사용하여 C++의 문자열로 파일 읽기
  2. rdbuf를 사용하여 C++에서 파일을 문자열로 읽기
  3. fread를 사용하여 파일을 문자열로 읽기
  4. read를 사용하여 파일을 문자열로 읽기
C++에서 파일을 문자열로 읽기

이 기사에서는 C++에서 파일 내용을std::string으로 읽는 몇 가지 방법을 설명합니다.

istreambuf_iterator를 사용하여 C++의 문자열로 파일 읽기

istreambuf_iteratorstd::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 개의 인수를 취합니다.

  1. 읽은 데이터가 저장되는 버퍼에 대한 포인터.
  2. 데이터 항목의 크기.
  3. 데이터 항목 수
  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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ File