먼저 불러들일 텍스트 파일 input.txt에는 숫자 세개가 적혀있다.
이제 C언어로 파일을 읽어 이 숫자들을 변수에 저장할 것이다.
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp; | |
int num1, num2, num3; | |
fp = fopen(argv[1], "r"); | |
fscanf(fp, "%d %d %d", &num1, &num2, &num3); | |
printf("%d %d %d\n", num1, num2, num3); | |
fclose(fp); | |
} |
컴파일후 실행할 때 ./a.out input.txt 을 입력하면 정상적으로 실행 된다. (input.txt자리에 읽을 파일 이름 쓰기)
💡 부연 설명
- 커맨드에 입력한 파일 이름은 argv[1]에 저장됨
(argv 배열에는 커맨드라인에 입력한 내용이 띄어쓰기로 구분되어 담긴다)
- fopen 함수는 파일을 여는 기능 / "r" : 파일 읽기 모드
- 변수 fp에 파일을 가리키는 포인터가 저장됨
- fscanf 함수는 파일에 있는 내용을 주어진 변수에 저장함. 이 경우 텍스트에 적힌 숫자 세개를 각 변수 num1, num2, num3에 저장함
- fclose 마지막에는 파일을 꼭 닫아줘야 함
이번에는 텍스트를 불러온 다음 프로그램 내부에서 수정을 해서 수정한 내용으로 새로운 텍스트 파일을 만들 것이다.
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp; | |
int num1, num2, num3; | |
fp = fopen(argv[1], "r"); | |
fscanf(fp, "%d %d %d", &num1, &num2, &num3); | |
printf("%d %d %d\n", num1, num2, num3); | |
fclose(fp); | |
} |
파일을 불러오는 과정은 1번에서 했던 것과 동일하다.
불러온 숫자들에 100을 더해서 새로운 텍스트 파일에 저장했다.
실행할 때는 ./a.out input.txt output.txt 의 형식으로 입력한다.
(input자리에 읽을 파일 이름, output자리에 새로 만들 파일 이름)
💡 부연 설명
- 이번에는 두 개의 파일이 필요하기 때문에 FILE* 변수를 두 개 선언했다 (fp1, fp2)
- fopen의 "w"는 쓰기모드를 의미함
- fprintf 함수로 fp2가 가리키는 파일(output.txt)에 변수의 내용들을 저장함
여기서는 input.txt의 내용을 읽어와 바이너리 파일로서 저장할 것이다.
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp1, *fp2; | |
int num1, num2, num3; | |
// read text file | |
fp1 = fopen(argv[1], "r"); | |
fscanf(fp1, "%d %d %d", &num1, &num2, &num3); | |
// write binary file | |
fp2 = fopen(argv[2], "wb"); | |
fwrite(&num1, sizeof(int),1, fp2); | |
fwrite(&num2, sizeof(int),1, fp2); | |
fwrite(&num3, sizeof(int),1, fp2); | |
// close file | |
fclose(fp1); | |
fclose(fp2); | |
} |
실행 커맨드 :
./a.out input.txt output.bi
💡 부연 설명
- 바이너리 파일을 쓸 때는 fopen을 바이너리 파일 쓰기 모드 "wb" 로 설정한다
- fwrite는 바이너리 파일을 쓰는 함수
- fwrite(값이 담겨 있는 변수의 주소, 저장할 변수의 크기, 저장할 변수의 개수, 저장할 파일)
- 첫줄에서 num1을 저장하고 나면 자동으로 포인터가 그 다음으로 이동하기 때문에 파일에 num1, num2, num3이 차례차례 저장된다
이제 위에서 저장한 바이너리 파일을 읽어올 차례
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp; | |
int num1, num2, num3; | |
// read binary file | |
fp = fopen(argv[1], "rb"); | |
fread(&num1, sizeof(int),1, fp); | |
fread(&num2, sizeof(int),1, fp); | |
fread(&num3, sizeof(int),1, fp); | |
printf("%d %d %d\n", num1, num2, num3); | |
// close file | |
fclose(fp); | |
} |
실행 커맨드 :
./a.out output.Bi
💡 부연 설명
- fopen은 바이너리 읽기 모드 "rb" 로 설정
- 바이너리 파일을 읽을 때는 fread를 쓴다
- fread(값을 저장할 변수의 주소, 변수 크기, 변수 개수, 읽을 파일)
기본 원리는 같기 때문에 배열명 자체가 어드레스인점, 변수 크기에만 신경쓰면 된다.
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp1, *fp2; | |
int arr[3]; | |
fp1 = fopen(argv[1], "r"); | |
fp2 = fopen(argv[2], "wb"); | |
fscanf(fp1, "%d %d %d", &arr[0], &arr[1], &arr[2]); | |
printf("%d %d %d\n", arr[0], arr[1], arr[2]); | |
fwrite(arr, sizeof(int), 3, fp2); | |
fclose(fp1); | |
fclose(fp2); | |
} |
이것도 기본원리는 같다. 오히려 이쪽이 더 프로그램이 단순하기 때문에 여러 개의 값들을 불러올 땐 배열을 쓰는 게 훨씬 편하다.
#include <stdio.h> | |
#include <stdlib.h> | |
int main(int argc, char **argv){ | |
FILE *fp; | |
int arr[3]; | |
fp = fopen(argv[1], "rb"); | |
fread(arr, sizeof(int), 3, fp); | |
printf("%d %d %d\n", arr[0], arr[1], arr[2]); | |
fclose(fp); | |
} |
fopen 모드 설정 | 필요한 함수들 | |
텍스트 파일 읽기 | r | fscanf |
텍스트 파일 쓰기 | w | fprintf |
바이너리 파일 읽기 | rb | fread |
바이너리 파일 쓰기 | wb | fwrite |
저는 실험 데이터의 입출력에 c언어가 필요해서, c언어 자체의 기술적인 면보다는 상황 별로 필요한 코드에 초점을 맞춰서 정리해봤습니다. 혹여 잘못된 부분이 있으면 지적부탁드립니다.
C언어 최소제곱법을 이용해 직선과 상관계수 구하기 (0) | 2021.01.02 |
---|---|
C언어 수치계산 - 다항식 계산 알고리즘 (호너법 Horner's method) (2) | 2020.11.23 |
C언어 수치계산 미분방정식 오일러법, 4차 룽게 쿠타법 알고리즘 (0) | 2020.09.05 |
C언어 수치계산 수치적분 (구분구적법, 사다리꼴, 심슨 공식) (0) | 2020.09.03 |
C언어 예제 두 수의 합 구하기 (0) | 2020.06.04 |
댓글 영역