본문 바로가기
프로그래밍/C

C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기

by eteo 2022. 8. 17.

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"