#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); // 목록 출력 후 파일 포인터를 다시 파일의 끝으로 이동
}
이러한 수정을 통해 프로그램의 안정성과 정확성이 향상됩니다. 파일 처리를 할 때는 항상 파일 열기 오류를 적절히 처리하고, 파일 읽기/쓰기 동작에서 발생할 수 있는 예외 상황을 고려해야 합니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 18) stdin과 stdout을 사용한 문자 입출력 (7) | 2024.10.08 |
---|---|
chapter 18) fread와 fwrite 함수의 차이 (0) | 2024.10.07 |
chapter 17) 최고 학점의 학생 데이터 출력 (0) | 2024.10.05 |
chapter 17) 구조체 배열을 초기화하고 출력 (1) | 2024.10.04 |
chapter 17) 자기 참조 구조체로 list 만들기 (0) | 2024.10.03 |