main 함수에 전달되는 파라미터를 활용해 코드를 짤 때는 아래와 같이 출력해 디버깅 해보면 편하다.
for(int i=0; i< argc; i++){
printf("%s\n",argv[i]);
}
1. main 함수의 argument 로 파일이름과 파일에 저장할 문자열을 입력받아 파일을 생성하는 프로그램
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
/*
for(int i=0; i< argc; i++){
printf("%s\n",argv[i]);
}
*/
if (argc < 3) {
printf("Usage: fileio.exe <FILE_NAME> <char*>");
return 0;
}
FILE *fp;
fp = fopen(argv[1], "w");
if(fp==NULL){
printf("file open error!");
return 1;
}
fwrite((const void *)argv[2], 1, strlen(argv[2]), fp);
char c='\n';
fwrite((const void *)&c, 1, sizeof(c), fp);
fclose(fp);
return 0;
}
~
파일명 : test.txt
파일에 저장할 문자열 : ASCII Code 0x30 부터 0x50까지
gcc fileio1.c -o 1.out
./1.out "test.txt" "0123456789:;<=>?@ABCDEFGHIJKLMNOP"
2. 파일이름과 문자열을 입력받아서 해당 파일에서 문자열을 검색해 삭제하고 출력하는 프로그램
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
if (argc < 3) {
printf("Usage: fileio.exe <FILE_NAME> <char*>");
return 0;
}
FILE *fp;
// 읽기 전용으로 열기
fp = fopen(argv[1], "r");
if(fp==NULL){
printf("file open error!");
return 1;
}
int len;
// 파일포인터를 맨끝으로 보내 파일 크기(byte)를 알아내고 len에 저장
fseek(fp, 0, SEEK_END);
len = ftell(fp);
char buffer[100]={0,};
// 다시 파일포인터를 맨앞으로 보내서
fseek(fp, 0, SEEK_SET);
// 파일을 읽어 buffer에 len byte 만큼 저장
fread(buffer, 1, len, fp);
// buffer에서 argv[2] 문자열 검색. 반환값 ptr은 buffer에서 일치한 문자열 시작위치(주소)
char* ptr = strstr(buffer, argv[2]);
// argv[2] 문자열 길이(NULL 불포함)만큼 포인터 ptr 주소 증가
// 원래 buffer 보다 argv[2] 문자열의 길이가 길 경우 예외처리도 필요한데 여기선 안해놨다.
ptr+=strlen(argv[2]);
printf("%s", ptr);
// 파일 닫은 다음에 쓰기전용으로 다시 열기
fclose(fp);
fp=fopen(argv[1], "w");
if(fp==NULL){
printf("file open error!");
return 1;
}
// 파일에 ptr 부터 strlen(ptr)만큼 쓰기
fwrite((const void *)ptr, 1, strlen(ptr), fp);
fclose(fp);
return 0;
}
파일명 : test.txt
파일에서 삭제할 문자열 : 0123456789
gcc fileio2.c -o 2.out
./2.out "test.txt" "0123456789"
'프로그래밍 > C' 카테고리의 다른 글
C ] 전처리기 (Preprocessor) (0) | 2022.08.24 |
---|---|
C, Linux ] ls 명령어 구현 (0) | 2022.08.17 |
C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 (0) | 2022.08.12 |
[ Visual Studio ] CRT 라이브러리로 메모리 누수 탐지하기 (0) | 2022.05.02 |
[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? (0) | 2022.05.02 |