>  기사  >  백엔드 개발  >  C 기반 파일 작업(FILE*, fstream, windowsAPI)

C 기반 파일 작업(FILE*, fstream, windowsAPI)

php是最好的语言
php是最好的语言원래의
2018-08-10 11:27:392485검색

C 기반 파일 작업

ANSI C에서 파일 작업은 스트리밍 파일 작업과 I/O 파일 작업이라는 두 가지 방법으로 나누어지며 이에 대해 소개합니다.

1. 스트리밍 파일 작업

이 파일 작업 방법에는 중요한 구조가 있습니다. FILE은 헤더 파일 stdio.h에 다음과 같이 정의됩니다.

typedef struct {int level;unsigned flags;char fd;unsigned char hold;int bsize;unsigned char _FAR *buffer;unsigned char _FAR *curp;unsigned istemp;short token;
} FILE;

FILE 이 구조에는 파일 작업의 기본 속성이 포함됩니다. 이 구조의 포인터를 통해 수행됩니다. 이러한 유형의 파일 작업에 일반적으로 사용되는 함수는 아래 표에 나와 있습니다. 함수 함수
fopen() 스트림 열기
fclose() 스트림 닫기
fputc() stream
fgetc() 스트림에서 문자 읽기
fseek() 스트림에서 지정된 문자 찾기
fputs() 스트림에 문자열 쓰기
fgets() 스트림에서 줄을 읽거나 문자 지정
fprintf() 형식에 따라 스트림으로 출력
fscanf()는 스트림에서 형식을 읽습니다.
feof()는 파일 끝에 도달하면 true를 반환합니다.
ferror()는 오류가 발생하면 해당 값을 반환합니다.
rewind()는 파일을 재설정합니다. 파일의 시작 부분에 위치 지정자
remove()는 파일을 삭제합니다.
fread()는 스트림에서 지정된 수의 문자를 읽습니다.
fwrite()는 지정된 수의 문자를 스트림에 씁니다.
tmpfile()은 임시 파일 스트림을 생성합니다
tmpnam()은 고유한 파일 이름을 생성합니다

아래에 소개하겠습니다. 이러한 함수는

1.fopen()
fopen의 프로토타입은 다음과 같습니다. FILE *fopen(const char *filename, const char *mode), fopen은 세 가지 기능을 구현합니다

사용할 스트림 열기
파일과 이 스트림 연결
이 스트림에 대한 FILR 포인터 반환
매개변수 filename은 열려는 파일의 이름을 가리키고, mode는 열기 상태의 문자열을 나타내며, 해당 값은 다음과 같습니다.

문자열 의미
r 읽기 전용 파일을 엽니다. 파일이 존재해야 합니다.
 r+는 읽고 쓸 수 있는 파일을 엽니다. 파일이 있어야 합니다.
 rb+는 읽기 및 쓰기용으로 바이너리 파일을 열고 데이터 읽기 및 쓰기만 허용합니다.
 rt+ 읽기 및 쓰기는 텍스트 파일을 열어 읽고 쓸 수 있습니다.
 w 쓰기 전용 파일을 엽니다. 파일이 존재하면 파일 길이가 0으로 지워집니다. 즉, 파일 내용이 사라집니다. 파일이 존재하지 않으면 파일을 생성하십시오.
  w+는 읽기 및 쓰기 가능한 파일을 엽니다. 파일이 존재하면 파일 길이가 0으로 지워집니다. 즉, 파일 내용이 사라집니다. 파일이 존재하지 않으면 파일을 생성하십시오.
 a 쓰기 전용 파일을 추가 모드로 엽니다. 파일이 없으면 파일이 생성됩니다. 파일이 있으면 작성된 데이터가 파일 끝에 추가됩니다. 즉, 파일의 원래 내용이 유지됩니다. (EOF 문자는 예약되어 있습니다)
 a+는 읽기 및 쓰기가 가능한 파일을 추가 모드로 엽니다. 파일이 없으면 파일이 생성됩니다. 파일이 있으면 작성된 데이터가 파일 끝에 추가됩니다. 즉, 파일의 원래 내용이 유지됩니다. (원본 EOF 문자는 유지되지 않습니다.)
 wb 쓰기용으로만 새 바이너리 파일을 열거나 생성합니다. 데이터 쓰기만 허용됩니다.
 wb+ 읽기 및 쓰기는 읽기 및 쓰기가 가능한 바이너리 파일을 열거나 생성합니다.
  wt+ 읽기 및 쓰기 텍스트 파일을 열거나 생성하여 읽고 쓸 수 있습니다.
 AT+는 텍스트 파일을 읽고 쓰기 때문에 텍스트 끝에 데이터를 읽거나 추가할 수 있습니다.
 ab+는 읽고 쓰기 위해 바이너리 파일을 열어 파일 끝에 데이터를 읽거나 추가할 수 있습니다.

파일은 텍스트 모드와 바이너리 모드에서 열 수 있습니다. 둘의 차이점은 텍스트 모드에서는 캐리지 리턴이 한 문자 'n'으로 간주되는 반면 바이너리 모드에서는 0x0D, 0x0A 두 문자로 간주된다는 것입니다. ; 파일에 있는 경우 0x1B를 읽으면 텍스트 모드는 이것이 파일의 끝이라고 생각합니다. 즉, 바이너리 모델은 파일을 처리하지 않고 텍스트 모드는 이에 따라 특정 방식으로 데이터를 변환합니다.

시스템은 기본적으로 _fmode의 값을 수정하여 이 설정을 수정할 수 있습니다. _fmode=O_TEXT;는 기본 열기 모드를 설정합니다. 모드는 바이너리 모드입니다.

이 함수는 FILE 포인터를 반환하므로 FILE 포인터를 선언한 후 초기화할 필요가 없습니다. 대신 fopen()을 사용하여 포인터를 반환하고 이를 특정 파일에 연결하면 성공하거나 실패하면 NULL이 반환됩니다. .

예:

FILE *fp;
if(fp=fopen("123.456","wb"))
puts("파일이 성공적으로 열렸습니다.")
else
puts("파일이 성공적으로 열렸습니다." );

2.fclose()
fclose()의 함수는 fopen()으로 열린 파일을 닫는 것입니다. 해당 프로토타입은 다음과 같습니다. int fclose(FILE *fp); 성공하면 0을 반환합니다. EOF를 반환합니다.

프로그램이 종료되면 반드시 열려 있는 파일을 닫아야 합니다. 그렇지 않으면 데이터가 손실될 수 있습니다. 예전에 이런 실수를 자주 했습니다.

예: fclose(fp);

3.fputc()
스트림에 문자를 씁니다. 프로토타입은 int fputc(int c, FILE *stream)입니다. 성공하면 이 문자를 반환하고, 실패하면 EOF를 반환합니다.

예: fputc('X',fp);

4.fgetc()
스트림에서 문자를 읽습니다. 프로토타입은 int fputc(FILE *stream)입니다. 성공하면 이 문자를 반환하고, 실패하면 EOF를 반환합니다.

예: char ch1=fgetc(fp);

  1. fseek()
    이 함수는 일반적으로 바이너리 모드로 열린 파일에서 사용됩니다. 이 함수는 스트림에서 지정된 위치를 찾는 것입니다. FILE *stream , long offset, int whence); 0이 성공적으로 반환되면 매개변수 offset은 이동된 문자 수이며, 여기서는 이동 기준이며 값은

    입니다.

기호 상수 값의 참조 위치
SEEK_SET 0 파일 시작
SEEK_CUR 1 현재 읽고 쓰는 위치
SEEK_END 2 파일 끝

예: fseek(fp,1234L,SEEK_CUR);//읽고 쓰는 위치 이동 현재 위치에서 뒤로 1234바이트 이동(L 접미사는 긴 정수를 나타냄)

fseek(fp,0L,2);//읽기 및 쓰기 위치를 파일 끝으로 이동

6.fputs()
Write 문자열을 스트림으로, 프로토타입 int fputs(const char *s, FILE *stream);

예: fputs("I Love You",fp);

7.fgets()
행을 읽거나 스트림의 경우 프로토타입은 char *fgets(char *s, int n, FILE *stream)입니다. 한 줄을 읽지 않는 한 스트림에서 n-1자를 읽습니다. 매개변수 s는 문자열을 수신하는 것입니다. s의 포인터, 그렇지 않으면 NULL을 반환합니다.

예: 파일의 현재 위치 텍스트가 다음과 같은 경우

Love ,I Have

But……..

fgets(str1,4,file1);

을 사용하면 그 다음 실행 str1="Lov ", 4-1=3자를 읽고,

fgets(str1,23,file1);

을 사용하면 str="Love, I Have"가 실행되어 한 줄을 읽습니다. (줄 끝 제외) 'n').

8.fprintf()
형식에 따라 스트림에 입력합니다. 프로토타입은 int fprintf(FILE *stream, const char *format[, 인수, …])입니다. 그러나 사용법은 printf()와 동일합니다. 콘솔에는 기록되지 않고 스트림에 기록됩니다.

예: fprintf(fp,"-%s",4,"Hahaha");

9.fscanf()
다음의 스트림에서 읽기 형식은 프로토타입이 int fscanf( FILE *stream, const char *format[, address, …])입니다. 사용법은 scanf()와 동일하지만 콘솔에서 읽지 않고 스트림에서 읽습니다.

예: fscanf(fp,"%d%d",&x,&y);

10.feof()
파일 끝에 도달했는지 여부를 감지하고 true를 반환하고, 그렇지 않으면 0을 반환합니다. 프로토타입은 다음과 같습니다. int feof(FILE *stream);

예: if(feof(fp))printf("파일 끝에 도달했습니다.");

11.ferror()
프로토타입은 int ferror(FILE *stream)입니다. ); 스트림의 최신 오류 코드를 반환합니다. 이를 지우려면clearerr()을 사용할 수 있습니다. ));

12.rewind()

현재 바꾸기 읽기 및 쓰기 위치가 파일의 시작 부분으로 돌아갑니다. 프로토타입은 void rewind(FILE *stream)입니다. 실제로 이 함수는 fseek(fp, 0L,SEEK_SET);


예: rewind(fp);

13.remove()

Delete File, 프로토타입은 int delete(const char *filename); 매개변수는 삭제할 파일 이름이고 0은 성공적으로 돌아왔습니다.


예: 제거(“c:io.sys”);

14.fread()

스트림에서 지정된 수의 문자를 읽습니다. 프로토타입은 size_t fread(void

ptr, size_t size, size_t n, FILE * 스트림); 매개변수 ptr은 읽은 데이터를 저장하는 것입니다. void
의 포인터는 char*, int * 등과 같은 모든 유형의 포인터로 대체될 수 있습니다. 숫자는 읽을 블록입니다. 성공하면 실제로 읽은 블록 수를 반환합니다(바이트 수가 아님). 이 함수는 일반적으로 이진 모드로 열린 파일에 사용됩니다. 예:

char x[4230];

FILE *file1=fopen("c:msdos.sys","r");


fread(x,200,12,file1);//총 읽기 수 200 *12=2400바이트

15.fwrite()

fread에 해당하고 지정된 데이터를 스트림에 씁니다. 프로토타입은 size_t fwrite(const void

ptr, size_t size, size_t n, FILE *stream)입니다. void
의 포인터는 char*, int * 등과 같은 모든 유형의 포인터로 대체될 수 있습니다. 크기는 블록당 바이트 수입니다. 성공하면 실제로 작성된 블록 수(바이트 수가 아님)를 반환합니다. 이 함수는 일반적으로 바이너리 모드로 열린 파일에 사용됩니다. 예:

char x[]=”I Love You”;

fwire(x, 6,12,fp);//Write 6*12=72 bytes


"I Love"를 Stream fp 12에 씁니다. 총 72바이트

16.tmpfile()

프로토타입은 FILE입니다. *tmpfile(void); 임시 파일을 생성하고 "w+b" 모드에서 열고 이 임시 스트림의 포인터를 반환합니다. 실패한. 프로그램이 끝나면 이 파일은 자동으로 삭제됩니다.


예: FILE *fp=tmpfile();

17.tmpnam();

프로토타입은 char *tmpnam(char *s); 실제로 tmpfile()은 이 함수를 호출합니다. 매개변수 s는 획득한 파일 이름을 저장하고 이 포인터를 반환하는 데 사용됩니다. 실패하면 NULL이 반환됩니다.


예: tmpnam(str1);

2. 직접 I/O 파일 연산

C에서 제공하는 또 다른 파일 연산입니다. 파일을 직접 저장/검색하여 파일 처리를 완료하며, 이전 글 스트리밍 파일 연산은 버퍼를 통해 수행됩니다. 스트리밍 파일 작업은 FILE 포인터를 중심으로 수행되며 이러한 유형의 파일 작업은 파일의 "핸들"을 중심으로 수행됩니다. 파일을 식별하기 위해 시스템에서 사용하는 정수 및 고유 토큰입니다(WINDOWS에서는 핸들 개념이 모든 장치 리소스 식별로 확장됩니다). 이러한 파일 작업에 일반적으로 사용되는 함수는 다음과 같습니다. 이러한 함수와 사용되는 일부 기호는 io.h 및 fcntl.h에 정의되어 있으며, 이를 사용할 경우 해당 헤더 파일을 추가해야 합니다.

함수 설명

open()은 파일을 열고 해당 핸들을 반환합니다.

close()는 핸들을 닫습니다.
lseek()는 파일의 지정된 위치를 찾습니다.
read()는 블록 단위로 파일을 읽습니다.
write()는 파일을 다음 위치에 씁니다. 블록
eof( ) 파일이 끝나는지 테스트
filelength() 파일 길이 가져오기
rename() 파일 이름 바꾸기
chsize() 파일 길이 변경

이 함수는 아래에서 하나씩 설명됩니다.

1.open()
파일을 열고 핸들을 반환합니다. 실패하면 0보다 작은 값이 반환됩니다. 프로토타입은 int open(const char *path, int access [, unsigned mode]); 경로는 열린 파일의 이름이며, 액세스는 열기 모드이고, 모드는 선택 사항입니다. 파일의 속성을 나타내며 주로 UNIX 시스템에서 사용됩니다. DOS/WINDOWS에서는 의미가 없습니다. 파일 열기 모드는 다음과 같습니다.

기호 의미 기호 의미 기호 의미
O_RDONLY 읽기 전용 모드 O_WRONLY 쓰기 전용 모드 O_RDWR 읽기/쓰기 모드
O_NDELAY UNIX 시스템에서 사용 O_APPEND 추가 모드 O_CREAT 파일이 없으면 생성
O_TRUNC 파일 길이를 다음으로 자릅니다. 0 O_EXCL 및 O_CREAT는 함께 사용됩니다. 파일이 존재하면 오류를 반환합니다. O_BINARY 바이너리 모드
O_TEXT 텍스트 모드

여러 요구 사항의 경우 "|" 연산자를 사용하여 연결할 수 있습니다. 예를 들어 O_APPEND|O_TEXT는 텍스트로 파일을 여는 것을 의미합니다. 모드와 추가 모드.

예: int handler=open("c:msdos.sys",O_BINARY|O_CREAT|O_WRITE)

2.close()
핸들을 닫습니다. 프로토타입은 int close(int handler)입니다. 성공하면 0을 반환합니다.

예: close(handle)

3.lseek()
지정된 위치를 찾습니다. 프로토타입은 다음과 같습니다. long lseek(int handler, long offset, int fromwhere); 매개변수 오프셋은 이동량이며 fromwhere입니다. 이동의 기본 위치입니다. 값은 앞서 언급한 fseek()과 동일합니다. SEEK_SET: 파일의 시작 SEEK_CUR: 파일의 현재 위치 SEEK_END: ​​파일의 끝. 이 함수는 실행 후 파일의 새로운 액세스 위치를 반환합니다.

예:

lseek(handle,-1234L,SEEK_CUR);//현재 위치에서 1234바이트 앞으로 액세스 위치를 이동합니다.
x=lseek(hnd1,0L,SEEK_END);//접근 위치를 파일 끝으로 이동, x=파일 끝 위치, 즉 파일 길이

4.read()
읽기 파일의 블록, 프로토타입은 int read(int 핸들, void *buf, unsigned len)입니다. 매개변수 buf는 읽은 데이터를 저장하고 len은 읽은 바이트입니다. 이 함수는 읽은 실제 바이트를 반환합니다.

예: char x[200];read(hnd1,x,200);

5.write()
파일에 데이터 조각을 씁니다. 프로토타입은 int write(int handler, void *buf, unsigned)입니다. len); 매개변수의 의미는 실제로 쓰여진 바이트를 반환하는 read()의 의미와 동일합니다.

예: char x[]=”I Love You”;write(handle,x,strlen(x));

7.eof()
feof()와 유사하며 파일이 종료되었는지 테스트하고 반환합니다. 1, 그렇지 않으면 0을 반환합니다. 프로토타입은 다음과 같습니다: int eof(int handler);

예: while(!eof(handle1)){… long filelength(int handler) ;lseek(handle,0L,SEEK_END)

예: long x=filelength(handle);

9.rename()

파일 이름을 바꾸세요. 프로토타입은 int rename(const char * oldname, const char *newname) ; 매개변수 oldname은 이전 파일 이름이고 newname은 새 파일 이름입니다. 0

을 성공적으로 반환했습니다. 예: rename("c:config.sys","c:config.w40");

10.chsize();

파일 길이를 변경합니다. 프로토타입은 int chsize(int handler, long)입니다. size) ; 매개변수 size는 파일의 새 길이를 나타내며, 성공하면 0을 반환하고, 그렇지 않으면 지정된 길이가 파일 길이보다 작으면 파일이 잘립니다. 파일 길이는 파일 끝에 '가 추가됩니다.

ios::app: 파일을 추가 모드로 엽니다.
ios::ate: 파일을 연 후 파일의 끝에 위치하며 ios:app에는 이 속성이 포함됩니다.
ios::binary: 다음 위치에서 파일을 엽니다. 바이너리 모드, 기본 모드는 텍스트 모드입니다. 두 방법의 차이점은 위에서 언급한 바와 같습니다
ios::in: 파일이 입력 모드로 열립니다(파일 => 프로그램)
ios::out: 파일이 출력 모드로 열립니다(프로그램 => 파일)
ios ::nocreate: 아니요 파일을 생성하므로 파일이 없으면 열기가 실패합니다.
ios::noreplace: 파일을 덮어쓰지 않으므로 파일이 있으면 파일 열기가 실패합니다.
ios::trunc: 파일이 있는 경우. 존재하는 경우 파일 길이를 0으로 설정합니다.
위 속성을 "또는"으로 연결할 수 있습니다. 예를 들어 ios::out|ios::binary

열린 파일의 속성 값은

0: 일반 파일, 열기 액세스
1: 읽기 전용 파일
2: 숨겨진 파일
4: 시스템 파일의 경우 "or" 또는 "+"를 사용하여 위 속성을 연결할 수 있습니다. 예를 들어 3 또는 1|2는 읽기로 파일을 엽니다. -전용 및 암시적 속성.

예: 바이너리 입력 모드에서 c:config.sys 파일을 엽니다

fstream file1

file1.open(“c:config.sys”,ios::binary|ios::in,0);

if open 이 함수에는 파일 이름이라는 하나의 매개변수만 있고 일반 파일을 읽고 쓰기 위해 열립니다. 즉,

file1.open("c:config.sys");96b4fef55684b9312718d5de63fb7121file1.open( "c:config.sys" ,ios::in|ios::out,0);

또한 fstream에는 open()과 동일한 생성자가 있습니다. 위의 예에서는 파일이 정의될 때 열 수 있습니다. :

fstream file1( "c:config.sys");

특히 fstream에는 ifstream(입력 파일 스트림)과 ofstream(출력 파일 스트림)의 두 가지 하위 클래스가 있습니다. Ifstream은 기본적으로 파일을 입력 모드로 엽니다(file = > 프로그램) , ofstream은 기본적으로 파일을 출력 모드로 엽니다.

ifstream file2("c:pdos.def");//입력 모드에서 파일 열기

ofstream file3("c:x.123");//파일을 출력 모드에서 열기

따라서 실제 응용 프로그램에서는 , 필요에 따라 정의할 다른 클래스를 선택합니다. 입력 모드로 열려면 ifstream을 사용하여 정의하고, 출력 모드로 열려면 ofstream을 사용하여 입력/출력 모드로 열도록 합니다. , fstream을 사용하여 정의하세요.

2. 파일 닫기 사용 후 열린 파일을 닫아야 합니다. fstream은 이 작업을 완료하기 위해 멤버 함수 close()를 제공합니다. 예: file1.close();

3. 파일 읽기 및 쓰기 파일 읽기와 쓰기는 텍스트 파일 읽기와 바이너리 파일 읽기로 나누어집니다. 텍스트 파일 읽기는 비교적 간단합니다. 삽입기와 추출기를 사용하면 됩니다. 바이너리 파일 읽기는 좀 더 복잡합니다. 아래에서 이 두 가지 방법을 자세히 소개하겠습니다

1. 텍스트 파일 읽기 및 쓰기 텍스트 파일 읽기 및 쓰기는 매우 간단합니다. 삽입기(9e8a70f114a33aaa8690f597c744904f>)는 파일에서 가져옵니다. file1이 입력으로 열리고 file2가 출력으로 열린다고 가정합니다. 예는 다음과 같습니다.

file2a6d39a010792fcdf6135874665a46b4f>i;//다음에서 정수 값을 입력합니다. 파일.
이 방법에는 간단한 형식 지정 기능도 있습니다. 예를 들어 출력을 16진수 등으로 지정할 수 있습니다. 구체적인 형식은 다음과 같습니다.

조작기 함수 입력/출력

dec 형식이 10진수 숫자 데이터 입력 및 출력
endl 출력 개행 문자 및 이 스트림 출력 새로 고침
ends 널 문자 출력 출력
hex 16진수 숫자 데이터 입력 및 출력으로 형식화
oct 8진수 데이터 입력 및 출력으로 형식화
setpxecision(int p) Set 부동 소수점의 정밀도 자릿수를 출력 포인트 번호

예를 들어 123을 16진수로 출력하려는 ​​경우: file1<<<123; 5자리 정밀도로 3.1415926을 출력하려는 ​​경우: file1<<<3.1415926.

2. 바이너리 파일 읽기 및 쓰기 ①put()
put() 함수는 스트림에 문자를 씁니다. 해당 프로토타입은 ofstream &put(char ch)이며 file1과 같이 사용이 비교적 간단합니다. put('c' ); 은 스트림에 문자 'c'를 쓰는 것입니다.

②get()

get() 함수는 더 유연하며 일반적으로 사용되는 3가지 오버로드 형식이 있습니다.

하나는 put()에 해당하는 형식입니다. ifstream &get(char &ch) 이 함수는 스트림에서 스트림을 읽는 것입니다. 문자에 대해서는 결과가 참조 ch에 저장되고, 파일의 끝에 도달하면 널 문자가 리턴됩니다. 예를 들어, file2.get(x)는 파일에서 문자를 읽고 읽은 문자를 x에 저장하는 것을 의미합니다.

다른 오버로드된 형식의 프로토타입은 다음과 같습니다. int get(); 이 형식은 파일 끝에 도달하면 x=file2.get()과 같이 EOF가 반환됩니다. 위의 예에서는 동일합니다.

또 다른 형태의 프로토타입이 있습니다: ifstream &get(char *buf,int num,char delim='n') 이 형태는 num개의 문자를 읽거나 만날 때까지 buf가 가리키는 배열로 문자를 읽습니다. delim에 도달하면 delim 매개변수를 사용하지 않으면 기본 개행 문자 'n'이 사용됩니다. 예:

file2.get(str1,127,'A');//파일에서 문자열 str1까지 문자를 읽고 문자 'A'가 발견되거나 127자를 읽으면 종료됩니다.

3데이터 블록 읽기 및 쓰기
바이너리 데이터 블록을 읽고 쓰려면 read() 및 write() 멤버 함수를 사용하세요. 해당 프로토타입은 다음과 같습니다.

read(unsigned char *buf,int num); unsigned char *buf,int num);

read()는 파일에서 num개의 문자를 buf가 가리키는 버퍼로 읽습니다. num개의 문자를 읽기 전에 파일 끝에 도달하면 int 멤버 함수를 사용할 수 있습니다. gcount() ; 읽은 실제 문자 수를 얻기 위해 write()는 buf가 가리키는 캐시에서 num 문자를 파일에 씁니다. 캐시 유형은 unsigned char *이며 때로는 유형 변환이 필요할 수도 있습니다. 필수의.

예:

unsigned char str1[]=”사랑해요”;

int n[5];
ifstream in(“xxx.xxx”);
out. write(str1,strlen(str1));//모든 문자열 str1을 yyy.yyy
in.read((unsigned char*)n,sizeof(n))에 쓰기;//xxx.xxx에서 읽기 정수 지정, 지불 유형 변환에 주의
in.close();out.close();

4. EOF 감지

멤버 함수 eof()는 파일의 끝에 도달했는지 감지하는 데 사용됩니다. 도달하면 0이 아닌 값이 반환되고, 그렇지 않으면 0이 반환됩니다. 프로토타입은 int eof();
예: if(in.eof())ShowMessage("파일 끝에 도달했습니다!");

5. 파일 위치 지정

C의 파일 작업 방법과의 차이점은 다음과 같습니다. C++ I/O 시스템은 파일과 관련된 두 개의 포인터를 관리합니다. 하나는 파일의 입력 작업 위치를 나타내는 읽기 포인터이고, 다른 하나는 다음 쓰기 작업의 위치를 ​​나타내는 쓰기 포인터입니다. 입력이나 출력이 수행될 때마다 해당 포인터가 자동으로 변경됩니다. 따라서 C++ 파일 위치 지정은 읽기 위치 지정과 쓰기 위치 지정으로 구분됩니다. 해당 멤버 함수는 seekg()이고, seekg()는 읽기 위치를 설정하는 것이고,eekp는 쓰기 위치를 지정하는 것입니다. 가장 일반적인 형식은 다음과 같습니다.


istream &seekg(streamoff offset,seek_dir Origin);

ostream &seekp(streamoff offset,seek_dir Origin);


streamoff는 iostream.h에 정의되어 있으며 얻을 수 있는 오프셋 오프셋을 정의합니다. 최대값인eek_dir은 이동의 기본 위치를 나타내며 다음 값을 포함하는 열거형입니다.

ios::beg: 파일의 시작

ios::cur: 파일의 현재 위치

ios::end : 파일 끝
이 두 함수는 일반적으로 바이너리 파일에 사용되는데, 텍스트 파일은 시스템의 문자 해석으로 인해 예상과 다른 값을 가질 수 있기 때문입니다.

예:

file1.seekg(1234,ios::cur);//파일의 읽기 포인터를 현재 위치에서 1234바이트 뒤로 이동

file2.seekp(1234,ios::beg);// 이동 파일의 시작 부분부터 1234바이트 뒤로 파일의 쓰기 포인터


WINAPI를 기반으로 한 파일 작업

WINAPI는 두 가지 파일 작업 기능을 제공합니다. 하나는 16비트 프로그램과의 호환성을 위한 것입니다. 다른 하나는 비교적 간단합니다. 하나는 32비트 프로그램용으로 특별히 제작된 것으로, 사용하기가 더 까다롭습니다. 아래에서는 이 두 가지 기능을 하나씩 소개하겠습니다.

1. 16비트 프로그램과 호환되는 기능 세트

⑴_lopen

프로토타입: HFILE _lopen(

LPCSTR lpPathName, // 파일 이름
int iReadWrite // 파일 액세스 방법
)

함수: 파일을 열고 핸들을 성공적으로 반환합니다. 도움말 파일을 직접 확인할 수 있습니다.

매개변수 설명: lpPathName은 열려는 파일 이름이고, iReadWrite는 파일 액세스 방법이며, 세 가지 주요 방법이 있습니다:

OF_READ: 읽기 전용 모드로 열기

OF_READWRITE: 읽기-쓰기 모드로 열기

OF_WRITE: 열기 쓰기 전용 모드에서 열기
OF_SHARE_COMPAT 등의 속성도 일반적으로 사용되지 않으므로 하나씩 소개하지 않겠습니다.

⑵_lclose()

프로토타입: HFILE _lclose( HFILE hFile);


함수: 파일을 닫고 0을 성공적으로 반환합니다.

매개변수 설명: hFile: 닫을 핸들

⑶_lread()

프로토타입: UINT _lread( HFILE hFile, // 파일 핸들

LPVOID lpBuffer, // 데이터를 저장할 버퍼
UINT uBytes // 읽을 길이
)

함수: 파일을 읽고 실제 읽은 문자 수를 반환합니다. _hread() 함수를 사용하면 도움말 파일을 직접 확인할 수 있습니다.

⑷_lwrite()

Prototype: UINT _lwrite( HFILE hFile, // 파일 핸들

LPCSTR lpBuffer, // 데이터 저장용 버퍼
UINT uBytes // 쓸 길이

함수: 파일 쓰기, 실제 반환 작성된 문자 수는 _hwrite() 함수와 유사하며 도움말 파일을 직접 확인할 수 있습니다.

⑸_llseek()

Prototype: LONG _llseek( HFILE hFile, // 파일 핸들

LONG lOffset, // 이동량

int iOrigin // 이동 ​​기준 위치
) 기능: 읽기 및 쓰기 위치 이동; 파일, 이동 후 파일의 읽기 및 쓰기 위치를 성공적으로 반환합니다

매개변수 설명: iOrigin의 값은 다음 세 가지 상황 중 하나입니다.

FILE_BEGIN: 파일 헤드

FILE_CURRENT: 파일 현재 위치

FILE_END: ​​​​file tail

⑹_lcreat()

Prototype :HFILE _lcreat(LPCSTR lpPathName, //생성할 파일 이름

int iAttribute //파일 속성
);

함수: 파일을 만들고 해당 핸들을 성공적으로 반환합니다.

매개변수 설명: 파일 속성은 다음 값의 합입니다.

0: 일반 파일

1: 읽기 전용 파일

2: 숨겨진 파일

4: 시스템 파일

이러한 함수의 사용법은 나열된 BCB 라이브러리 함수와 유사합니다. BCB 라이브러리 기능을 사용하는 것이 좋습니다. BCB 라이브러리 기능을 기반으로 한 이전 파일 작업을 참조하십시오.

2. 32비트 프로그램과 호환됩니다

CreateFile
파일 열기
파일을 읽고 쓰려면 먼저 이 함수를 통해 파일 핸들을 얻어야 합니다. 파일세계.

ReadFile
파일에서 바이트 정보를 읽습니다.
파일을 열고 파일 핸들을 얻은 후 이 함수를 통해 데이터를 읽을 수 있습니다.

WriteFile
바이트 정보를 파일에 씁니다.
파일 핸들을 이 함수에 전달하여 파일 데이터를 쓸 수도 있습니다.

CloseHandle
파일 핸들을 닫습니다.
문을 연 후에는 자연스럽게 닫는 것을 잊지 마세요.

GetFileTime
파일 시간을 가져옵니다.
사용 가능한 파일 시간은 생성 시간, 마지막 액세스 시간, 마지막 쓰기 시간의 세 가지입니다.
이 함수에는 항목 매개변수로 파일 핸들도 필요합니다.

GetFileSize
파일 크기를 가져옵니다.
파일 크기가 수 기가바이트(1G는 30비트 필요)까지 커질 수 있기 때문에 32비트 더블바이트 형식에서는 정확하게 표현할 수 없기 때문에 반환 코드는 하위 32비트를 나타내며, 이를 알 수 있는 종료 매개변수가 있습니다. 상위 32비트를 전달합니다.
이 함수에는 항목 매개변수로 파일 핸들도 필요합니다.

GetFileAttributes
파일 속성을 가져옵니다.
파일의 아카이브, 읽기 전용, 시스템, 숨김 및 기타 속성을 얻을 수 있습니다.
이 함수에는 매개변수로 파일 경로만 필요합니다.

SetFileAttributes
파일 속성을 설정합니다.
얻을 수 있으면 자연스럽게 설정할 수 있어야 합니다.
파일의 보관, 읽기 전용, 시스템, 숨김 및 기타 속성을 설정할 수 있습니다.
이 함수에는 매개변수로 파일 경로만 필요합니다.

GetFileInformationByHandle
모든 파일 정보 가져오기
이 함수는 크기, 속성 등과 같이 위의 모든 함수에서 얻을 수 있는 정보를 얻을 수 있으며 파일 레이블, 인덱스와 같이 다른 곳에서는 얻을 수 없는 일부 정보도 포함합니다. 그리고 링크 정보.
이 함수에는 항목 매개변수로 파일 핸들이 필요합니다.

GetFullPathName
파일 경로를 가져옵니다. 이 함수는 파일의 전체 경로 이름을 가져옵니다.
참고: 파일이 현재 디렉터리에 있는 경우에만 결과가 정확합니다. 실제 경로를 얻고 싶다면. GetModuleFileName 함수를 사용해야 합니다.

CopyFile
파일 복사
참고: 파일만 복사할 수 있으며 디렉터리는 복사할 수 없습니다.

MoveFileEx
파일 이동
파일과 디렉터리를 모두 이동할 수 있지만 드라이브 문자 간에 이동할 수는 없습니다. (드라이브 간 문자 작업을 수행하려면 Windows 2000에서 이동 플래그를 설정하십시오.)

DeleteFile
파일 삭제

GetTempPath
Windows 임시 디렉터리 경로 가져오기

GetTempFileName
Windows 임시 디렉터리 경로에 고유한 임시 파일 만들기

SetFilePoint
파일 포인터 이동.
이 기능은 파일에 대한 고급 읽기 및 쓰기 작업에 사용됩니다.

파일 잠금 및 잠금 해제

LockFile
UnlockFile
LockFileEx
UnlockFileEx

위 네 가지 기능은 파일을 잠그고 잠금 해제하는 데 사용됩니다. 이를 통해 파일의 비동기 작업이 가능해집니다. 파일의 여러 부분에 대해 동시에 별도의 작업을 수행할 수 있습니다.

파일 압축 및 압축 풀기

LZOpenFile
읽기 위해 압축 파일 열기

LZSeek
압축 파일에서 위치 찾기

LZRead
압축 파일 읽기

LZClose
압축 파일 닫기

LZCopy
복사 압축

GetExpandedName
압축된 파일에서 파일 이름을 반환합니다.

위 6개 함수는 32비트 API의 작은 확장 라이브러리와 파일 압축 확장 라이브러리에 있는 함수입니다. 압축 명령을 사용하여 파일 압축을 생성할 수 있습니다.

파일 이미징/매핑

32비트 API는 파일을 애플리케이션의 가상 메모리 공간에 직접 매핑할 수 있는 파일 이미징/매핑이라는 기능을 제공합니다. 이 기술을 사용하면 파일 액세스를 단순화하고 속도를 높일 수 있습니다. +

C# 파일 쓰기 작업 - Geek Academy C# 동영상 튜토리얼


Word 문서에서 테이블 생성, 삽입, 스타일 설정 등을 위한 C# 작업 예제

위 내용은 C 기반 파일 작업(FILE*, fstream, windowsAPI)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.