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

chapter 18) a+ 모드로 파일의 내용을 확인하며 출력

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

int main(void){
    FILE *fp;
    char str[20];

    fp = fopen("a.txt", "a+");
    if (fp == EOF){
        printf("do not make the file.\n");
        return 1;
    }

    while (1){
        printf("fruit name : ");
        scanf("%s", str);
        if (strcmp (str, "end") == 0){ break; }
        else if (strcmp (str, "list") == 0) {
            fseek(fp , 0, SEEK_SET);
            while(1){
                fgets(str, sizeof(str), fp);
                if (feof(fp)) break;
                printf("%s", str);
            }
        }
        else fprintf(fp, "%s\n", str);
    }
    fclose(fp);
    return 0;
}

### 코드 설명

- `FILE *fp;`는 파일 포인터 `fp`를 선언합니다.
- `fp = fopen("a.txt", "a+");`는 "a.txt" 파일을 추가 모드(`"a+"`)로 엽니다. 이 모드에서는 파일의 끝에 데이터를 추가할 수 있으며, 파일이 없는 경우 새로 생성됩니다. 파일 포인터는 파일의 끝에 위치합니다.
- `if (fp == EOF)` 부분은 파일 열기 오류를 확인하는 조건입니다. 하지만 이 조건은 잘못되었습니다. `fp`가 `NULL`인지 확인해야 합니다(`if (fp == NULL)`).
- `scanf("%s", str);`를 사용하여 사용자로부터 문자열을 입력받습니다.
- 입력된 문자열이 "end"인 경우 `break;`를 통해 무한 루프를 종료하고 프로그램을 종료합니다.
- 입력된 문자열이 "list"인 경우, `fseek(fp , 0, SEEK_SET);`를 사용하여 파일 포인터를 파일의 시작으로 이동합니다. 그런 다음 `fgets`와 `feof` 함수를 사용하여 파일의 모든 내용을 읽고 출력합니다.
- 그 외의 경우, 입력된 문자열은 과일 이름으로 간주되어 `fprintf(fp, "%s\n", str);`를 사용하여 파일에 추가됩니다.
- `fclose(fp);`를 사용하여 파일을 닫습니다.

### 수정사항

- 파일 열기 오류 검사를 `if (fp == EOF)`에서 `if (fp == NULL)`로 수정해야 합니다.
- 파일을 읽는 도중 `feof(fp)`를 사용하여 파일의 끝에 도달했는지 검사하는 것은 안전하지 않을 수 있습니다. 대신 `fgets`가 `NULL`을 반환할 때까지 읽는 것이 일반적입니다. 따라서 `if (feof(fp)) break;` 대신 `fgets`의 반환값을 직접 확인하는 방식으로 수정하는 것이 좋습니다.

### 개선된 파일 읽기 부분

else if (strcmp(str, "list") == 0) {
    fseek(fp, 0, SEEK_SET);
    while(fgets(str, sizeof(str), fp) != NULL) { // 파일의 끝까지 내용을 읽어 출력
        printf("%s", str);
    }
    fseek(fp, 0, SEEK_END); // 목록 출력 후 파일 포인터를 다시 파일의 끝으로 이동
}



이러한 수정을 통해 프로그램의 안정성과 정확성이 향상됩니다. 파일 처리를 할 때는 항상 파일 열기 오류를 적절히 처리하고, 파일 읽기/쓰기 동작에서 발생할 수 있는 예외 상황을 고려해야 합니다.

728x90
반응형
LIST