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
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