#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" 파일은 새로 생성하거나 덮어쓰기를 시도하고 있습니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 18) 파일의 내용을 화면에 출력하기 (0) | 2024.10.14 |
---|---|
chapter 18) 파일을 열고 닫는 프로그램 (1) | 2024.10.13 |
chapter 18) 버퍼를 공유함으로 인해 발생하는 문제 (1) | 2024.10.11 |
chapter 18) 문자열을 한 문자씩 파일로 출력하기 (6) | 2024.10.10 |
chapter 18) 다양한 자료형을 형식에 맞게 입출력 (2) | 2024.10.09 |