C에서 파일 리디렉션 사용

Jinku Hu 2023년10월12일
C에서 파일 리디렉션 사용

이 기사에서는 C에서 파일 리디렉션을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

<연산자를 사용하여 표준 입력 리디렉션

파일 리디렉션은 일반적으로 UNIX 기반 시스템에서I/O리디렉션으로 알려져 있으며,이를 통해 사용자는 표준 입력의 출처 또는 표준 출력의 출처를 재정의 할 수 있습니다. <연산자는 표준 입력의 출처를 변경하는 데 사용됩니다. 이 방법은 파일 내용에서 사용자 입력을 가져 와서 프로그램 버퍼에 저장하는 데 유용 할 수 있습니다. 이 경우fgets함수를 사용하여 개행 문자가 나타날 때까지 파일의 내용을 읽습니다. 새 줄 문자를 읽을 때 주어진 버퍼에도 저장되고 그 뒤에 널 바이트로 끝나는 문자열이 저장됩니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#define SIZE 1000

int main(int argc, char *argv[]) {
  char buf[SIZE];
  printf("Write input text: ");
  fgets(buf, SIZE, stdin);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

샘플 명령 :

./program < input.txt

출력:

The first line from the input.txt file

이전 샘플 코드에서는 하드 코딩 된 값으로 버퍼를 할당했습니다. 그럼에도 불구하고 사용자가 제공 한 입력 파일은 저장하기 위해 더 많은 메모리가 필요할 수 있으며 시나리오에 맞는 적응 형 방법을 구현해야합니다. 이를 위해malloc을 사용하여 동적 메모리를 할당하고 파일의 첫 번째 줄을 저장하는 데 필요한 최대 수로 총 파일 크기를 전달합니다. 이 방법은 주어진 파일이 너무 크고 첫 번째 줄이 단순히 짧은 경우 너무 많은 메모리를 낭비 할 수 있습니다. 그러나malloc이 실패하지 않고 시스템 메모리가 부족하지 않는 한 코드가 가장 긴 행에서 읽을 수 있음을 보장합니다.

stat시스템 호출을 사용하여 파일 크기를 검색하지만 입력 파일의 경로 이름이 필요합니다. 명령 줄 인수로 명시 적으로 전달하지 않으면 검색 할 수 없습니다. 그러나 모든 함수 호출은fgets가 초기화되지 않은 메모리 영역에 쓰기를 시도하지 않고 프로그램이 실패로 종료되는 것을 보장하기 위해 성공적인 리턴을 확인해야합니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {
  char *buffer = NULL;
  const char *filename = NULL;
  struct stat sb;

  if (argc != 2) {
    printf("Usage: ./program filename < filename\n");
    exit(EXIT_FAILURE);
  }

  filename = argv[1];

  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  buffer = malloc(sb.st_size);
  if (!buffer) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  printf("Write input text: ");
  if (fgets(buffer, sb.st_size, stdin) == NULL) {
    perror("fgets");
    exit(EXIT_FAILURE);
  }
  printf("%s\n", buffer);

  exit(EXIT_SUCCESS);
}

샘플 명령 :

./program input.txt < input.txt

출력:

The first line from the input.txt file
작가: 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