카테고리 없음

파일 입출력, 표준입출력

twoweeks-within 2024. 11. 8. 18:02

언제 사용?

1. 컴파일러 만들때
2. 그림 파일 저장 해석
자료는 DB로 저장, SQL 사용
3. 옵션 지정 할때
컴파일 따로 안하고 옵션에 따라 실행되도록

 

>> 실제에선 사실 라이브러리 가져다씀

 

하드웨어마다 데이터 저장 방법은 다 다름
( ssd, hdd, 플로피디스크 flash memory,,,,)

임베디드 > 데이터시트를 다 읽어봐야함
한번에 얼마나 저장, 몇번 기록, 통신방식, 패킷
그래야 1byte 를 저장할 수 있음
>> 계층(단계) 을 나눔
hw <-> driver <-> 운영체제> read write open  
>함수를 쓰면 운영체제에서 누군가 만든 driver 구현한거를 이용해서 hw에 접근
스트림
write : hdd에 기록 > 때때마다 하면 굉장히 비효율적,,
(ex) hdd가 한공간에 8byte > write가 1byte 라면 손해 큼
>>중간에 스트림 영역 확보
어느정도 찼을때 hdd에 넣음
>> 중간에 꺼버리면 hdd에 기록못하고 날라갈 수도 있음
(바로 넘기는 함수도 존재)

어플리케이션단 함수 ( f 가 붙음)
fopen > 파일 스트림이 열림
fread > 열린것을 읽어옴
fwrite > 열린것을 씀
fclose >반드시! 닫아줘야함

fseek : 커서를 움직이는 함수 ( txt 상에서 커서)
> 맨끝으로 가면 EOF 로 반환 // EOF = -1
for문에서 open
close를 안하면 메모리리프 같은 오류 발생

 

파일입출력 예제
텍스트파일 a.txt
-main.c-
FILE * fd;   // fd라는 구조체
char ch;

fd= fopen("a.txt", "r");  //포인터명, fopen(파일명,모드) // r: read //반환 : NULL
// w: 지우고 새로씀. a : 뒤에다 추가 
if(fd==NULL) //반환형 NULL > fd가 없을때

ch=fgetc(fd); // ch 배열에 텍스트파일읽어온 fd 를 싹 넣음
if(ch==EOF){ // End Of File : 파일의 끝

break;

}putchar(ch);  // 문자 출력함수
// if 문을 먼저 써서 EOF 일때를 걸러내기

fclose(fd);  //닫기
@
fd= fopen("a.txt", "a");
fprintf(fd, "hello~ hello~ \n");
fclose (fd); //쓰기모드
>>>>> 
1.파일을 연다. ( 여는 옵션이 있다.)
읽기모드, 쓰기모드,추가모드 ,,,, 여러가지 모드가 있다.
2. 파일을 읽거나,쓴다
3. 파일을 닫는다
표준입출력
소스코드 : 입력
콘솔창: 출력
int fd; // open 의 return : 정수형
fd = open ("a.txt", O_WRONLY | O_APPEND);
                                (쓰기전용) | ( 추가모드)  // 기존 파일 유지하면서  (비트) or >  둘다함
// 비트 연산값//
-1 : 파일 열기 실패
0 : 내 키보드
1 : 표준 출력 (콘솔)  // printf 같은 함수들
2 : 에러 출력 (콘솔) // 오류메세지 출력용
3,4,5,6.. :  open 같은 함수, 차례로 쭈루룩
 //표준출력 디스크립터(입출력 스트림 식별하기 위한 정수)
ex)

표준 출력 : 표준출력 디스크립터 
int fd = fileno(stdiout)
printf ( "printf(디스크립터 값: %d\n", fd);  // 1이 나옴
>> fd = 1
표준함수 리턴값
int count = printf("Hello World! \n");
printf(" printf result= %d\n", count);
>> count = 13  // \n 은 한개