input 파일에 숫자가 무언가(공백, 콜론, 따옴표)로 구분되어 있고, 그 숫자를 함수에서 사용하고자 할 때 편하고 정확하게 변수에 저장할 수 있는 코드입니다. 전체코드는 아래에 있습니다.
코드를 설명하기에 앞서, atoi와 strtok이 무엇인지 간단하게 알아보도록 하겠습니다.
atoi는 문자열을 정수로 변환해주는 함수로, 헤더파일 <stdlib.h>에 선언되어 있습니다.
함수 원형은
int atoi(const char *str)
이며, 문자열을 숫자열로 바꾸는 함수는 atoi() 말고도 atof(), atol()이 있으며, 각각 문자열을 double(실수)로, long으로 바꾸는 함수입니다.
strtok는 문자열을 기준을 가지고 분리해주는 함수이고, <string.h> 헤더파일을 사용합니다.
함수 원형은
char* strtok(char* str, const char* delimiters);
이며 str은 분리하고자 하는 기준 문자열이고, strtok는 분리한 결과의 첫번째 주소값을 리턴합니다.
예를 들어 전체 문자열이 str이고 char str[10] = "hello world"; 라고 한다면,
strtok(str, " "); 의 첫 반환값은 "hello"가 됩니다.
그리고 바로 그 다음 strtok(NULL, " "); 를 사용하면 "world"를 반환합니다.
한 번 반복한다면 str문자열이 끝났기 때문에 NULL을 반환합니다.
따라서, strtok는 문자열을 잘게 분할해야 한다면 원하는 만큼 반복해서 strtok(NULL, " ");를 반복해주어야 합니다.
이번 게시물의 테스트케이스는 다음과 같습니다.
Input_1.txt
50 100
100 90
150 180
200 70
250 150
Input_2.txt
200 70
100 90
50 100
250 150
150 180
...
이전 게시물에서 구현한 파일입출력 기본 format을 사용하여 만들어보겠습니다.
#define _CRT_SECURE_NO_WARNINGS
#define NUMBER_OF_FILES 5
#define ELEPHANTS 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Elephant {
int weight;
int iq;
}elephant[ELEPHANTS];
전처리문과 구조체입니다.
테스트 파일은 두 숫자가 공백으로 구분되어 있는데, 이것을 각각 코끼리의 몸무게와 IQ로 가정하고 두 개의 정수 변수에 저장하겠습니다.
이를 구조체로 묶어 다른 함수에서 사용하기 편리하게 만들었습니다.
if (input != NULL) {
while (fgets(arr, sizeof(arr), input) != NULL) {
elephant[order].weight = atoi(strtok(arr, " "));
elephant[order].iq = atoi(strtok(NULL, " "));
order++;
}
for (int i = 0; i < order; i++) {
printf("%d %d\n", elephant[i].weight, elephant[i].iq);
}
}
else {
printf("Error.");
exit(1);
}
File_input() 함수 안에서 실질적인 구현 부분만 가지고 왔습니다.
파일을 제대로 찾을 경우,
파일의 끝까지(EOF) fgets 함수를 이용해 한 줄씩 arr에 배열로 저장하면,
구조체의 weight에 strtok를 통해 공백 앞쪽 숫자를 문자열에서 정수로 변환하여 저장하고,
마찬가지로 구조체의 iq에 strtok로 공백 뒷쪽 숫자를 정수로 변환해 저장하고
이것을 파일의 텍스트 줄의 개수만큼 반복합니다.
아래는 전체 코드입니다. 감사합니다.
#define _CRT_SECURE_NO_WARNINGS
#define NUMBER_OF_FILES 5
#define ELEPHANTS 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Elephant {
int weight;
int iq;
}elephant[ELEPHANTS];
void File_input(int i) {
char Input[5][15] = {
"Input_1.txt", "Input_2.txt", "Input_3.txt", "Input_4.txt", "Input_5.txt"
};
printf("input_%d.txt\n\n", i + 1);
FILE* input;
input = fopen(Input[i], "r");
int order = 0;
char arr[10];
if (input != NULL) {
while (fgets(arr, sizeof(arr), input) != NULL) {
elephant[order].weight = atoi(strtok(arr, " "));
elephant[order].iq = atoi(strtok(NULL, " "));
order++;
}
for (int i = 0; i < order; i++) {
printf("%d %d\n", elephant[i].weight, elephant[i].iq);
}
}
else {
printf("Error.");
exit(1);
}
fclose(input);
}
void File_output(int i) {
char Output[5][15] = {
"Output_1.txt", "Output_2.txt", "Output_3.txt", "Output_4.txt", "Output_5.txt"
};
FILE* output;
output = fopen(Output[i], "w");
if (output != NULL) {
//write function
}
else {
printf("Error.");
exit(1);
}
fclose(output);
}
int main(void) {
for (int i = 0; i < NUMBER_OF_FILES; i++) {
File_input(i);
File_output(i);
}
}
'C언어' 카테고리의 다른 글
[C언어] input 파일이 많은 경우 파일 입출력 기본 형식 (0) | 2022.09.16 |
---|