본문 바로가기
개념/혼자 공부하는 C언어

chapter 18) 여러 줄의 문장을 입력하여 한 줄로 출력

by kiseno 2024. 10. 12.
728x90
반응형
SMALL
#include <stdio.h>
#include <string.h>

int main(void){
    FILE *ifp, *ofp;
    char str[80];
    char *res;

    ifp = fopen("a.txt", "r");
    if (ifp == NULL){
        printf("do not make the file.\n");
        return 1;
    }
    ofp = fopen("b.txt", "w");
    if (ofp == NULL){
        printf("do not make the file.\n");
        return 1;
    }

    while(1){
        res = fgets(str, sizeof(str), ifp);
        if (res == NULL) break;
        str[strlen(str) - 1] = '\0';
        fputs(str, ofp);
        fputs(" ", ofp);
    }
    fclose(ifp);
    fclose(ofp);

    return 0;
}

### 코드 설명

- 두 개의 `FILE` 포인터, `ifp`와 `ofp`,를 선언합니다. `ifp`는 입력 파일을 위한 포인터이며, "a.txt"를 읽기 모드로 엽니다. `ofp`는 출력 파일을 위한 포인터이며, "b.txt"를 쓰기 모드로 엽니다.

- 파일을 성공적으로 열지 못한 경우, 에러 메시지를 출력하고 프로그램을 비정상적으로 종료합니다.

- `while(1)` 무한 루프를 사용하여 `ifp`로부터 문자열을 읽습니다. `fgets` 함수는 한 줄을 읽거나 버퍼의 크기에 도달할 때까지 문자열을 읽어 `str`에 저장합니다. 파일의 끝에 도달하거나 읽기 오류가 발생한 경우 `fgets`는 `NULL`을 반환합니다.

- 읽은 문자열의 마지막에 있는 개행 문자(`'\n'`)를 제거하기 위해 `str[strlen(str) - 1] = '\0';`를 사용합니다. 하지만 이 코드는 문자열이 비어 있지 않은 경우에만 안전하게 작동하며, 개행 문자가 실제로 존재할 때에만 필요합니다.

- 수정된 문자열을 `ofp`를 통해 "b.txt" 파일에 쓰고, 각 줄 사이에 공백을 추가합니다.

- 모든 작업이 완료되면, 입력 파일과 출력 파일을 닫습니다.

### 주의사항 및 수정사항

- `str[strlen(str) - 1] = '\0';` 부분은 `fgets`가 빈 문자열을 반환하지 않는 경우에만 안전하게 작동합니다. 문자열의 길이가 0인 경우(즉, 빈 문자열인 경우) `strlen(str) - 1`는 부적절한 인덱스를 참조하게 됩니다. 따라서 이 코드는 개행 문자가 실제로 문자열의 끝에 있는 경우에만 사용해야 합니다.

- 문자열 처리를 조금 더 안전하게 하기 위해서는 개행 문자를 제거하기 전에 문자열의 길이를 확인하고, 개행 문자가 존재하는지 확인하는 추가 검사가 필요합니다.

- 프로그램에서 "do not make the file.\n" 메시지는 파일을 생성하지 못했을 때 출력됩니다. 하지만 오류 메시지는 일반적으로 "Cannot open the file.\n"과 같이 "열기"에 대한 실패를 명시하는 것이 더 명확할 수 있습니다. "a.txt" 파일은 열기를 시도하고 있으며, "b.txt" 파일은 새로 생성하거나 덮어쓰기를 시도하고 있습니다.

728x90
반응형
LIST