C언어 · 파일 입출력(만자 상세설명)

여기에 이미지 설명 삽입

배움의 가장 큰 이유는 평범함을 버리는 것입니다 하루 일찍 삶이 더 화려해질 것이고 하루가 지나면 하루 더 평범해질 것입니다.

공부일기

목차

공부일기

머리말

1. C 파일에 대한 기본 지식

1. 파일이란?

2. 파일명 

3. 파일 분류

4. 파일 버퍼

5. 파일 형식 포인터 

2. 파일 열기 및 닫기

1. 파일 열기 및 닫기

2. fopen 함수로 데이터 파일 열기 

3. fclose 함수로 데이터 파일 닫기

3. 데이터 파일의 순차적 읽기 및 쓰기

1. 파일에서 문자를 읽고 쓰는 방법

 문자를 읽고 쓰는 기능

예 1

예 2

 문자열을 읽고 쓰는 함수

2. 파일에 문자열을 읽고 쓰는 방법 

예 3

3. 형식화된 방식으로 텍스트 파일 읽기 및 쓰기 

4. 바이너리 모드에서 파일에 데이터 세트 읽기 및 쓰기

5. 주의 읽기

4. 임의로 데이터 파일 읽기 및 쓰기

1. 파일 위치 표시 및 위치 지정

1. 파일 위치 마커

2. 파일 위치 마크의 위치 지정 

5. 파일 읽기 및 쓰기 오류 감지

1. 오류 함수 

2. 명확한 기능 

알아채다


머리말

        파일 작업은 매우 실용적인 작업입니다. 아래에서 살펴보자! 

1. C 파일에 대한 기본 지식

1. 파일이란?

        파일에는 여러 가지 유형이 있으며 프로그래밍에서는 주로 두 가지 유형의 파일이 사용됩니다.

(1) 프로그램 파일. 소스 프로그램 파일(suffix .c), 목적 파일(suffix .obj), 실행 파일(suffix .exe) 등을 포함합니다. 그러한 파일의 내용은 프로그램 코드입니다.

(2) 데이터 파일. 파일의 내용은 프로그램이 아니라 프로그램 실행 중에 디스크(또는 기타 외부 장치)로 출력되는 데이터나 프로그램 실행 중에 읽어온 데이터 등 프로그램 실행 중에 읽고 쓰기 위한 데이터입니다. 프로그램. 학생 성취도 데이터 배치, 상품 거래 데이터 등

        입출력 장치에 대한 사용자의 조작을 단순화하여 사용자가 다양한 입출력 장치를 구별할 필요가 없도록 운영 체제는 모든 장치를 파일로 취급합니다. 운영 체제의 관점에서 호스트에 연결된 각 입출력 장치는 파일로 간주됩니다. 예를 들어 터미널 키보드는 입력 파일이고 디스플레이 화면과 프린터는 출력 파일입니다.

        파일은 일반적으로 외부 매체에 저장된 데이터 모음을 의미합니다 .

        운영 체제는 파일 단위로 데이터를 관리합니다. 입출력은 데이터가 전송되는 과정이고, 데이터는 흐르는 물처럼 한 곳에서 다른 곳으로 흐르기 때문에 입출력을 흔히 스트림(stream), 즉 데이터 흐름이라고 부른다. 흐름은 소스에서 대상으로의 정보 흐름을 나타냅니다. 입력 작업 중에는 데이터가 파일에서 컴퓨터의 메모리로 흐르고 출력 작업에서는 데이터가 컴퓨터에서 파일(예: 프린터, 디스크 파일)로 흐릅니다.

         C 언어는 파일을 일련의 문자(또는 바이트)로 간주합니다. 즉, 파일은 문자(또는 바이트) 데이터 시퀀스로 구성됩니다. 입력 및 출력 스트림은 문자 또는 바이트의 스트림입니다(콘텐츠는 이진 데이터임). C의 데이터 파일은 일련의 문자(또는 바이트)로 구성되며, 행의 경계에 관계없이 두 행의 데이터 사이에 구분자가 자동으로 추가되지 않으며 파일에 대한 액세스는 문자( 바이트). 입력 및 출력 데이터 스트림의 시작과 끝은 물리적 기호(예: 캐리지 리턴 및 줄 바꿈)가 아닌 프로그램에 의해서만 제어되므로 처리 유연성이 향상됩니다. 이러한 파일을 스트리밍 파일이라고 합니다. 

2. 파일명 

파일에는 사용자 식별 및 참조를 위한 고유한 파일 식별자가 있어야 합니다.

파일 식별에는 (1) 파일 경로, (2) 파일 이름 트렁크, (3) 파일 접미사의 세 부분이 포함됩니다.

D:\CC\임시\file1.dat        

          ↓ ↓ ↓      

경로 트렁크 이름 접미사

파일 경로는 외부 저장 장치의 파일 위치를 나타냅니다.

파일 이름 스템의 이름 지정 규칙은 식별자의 이름 지정 규칙을 따릅니다.

파일 접미사는 파일의 특성을 나타내는 데 사용됩니다.

편의상 파일 식별자를 파일명으로 지칭하는 경우가 많으나, 이때 소위 파일명에는 실제로는 주요 파일명만이 아니라 위의 세 부분이 포함되어 있음을 이해하여야 한다.

3. 파일 분류

        데이터 파일은 조직 형태에 따라 ASCII 파일과 바이너리 파일로 나눌 수 있습니다. 데이터는 메모리에 바이너리 형태로 저장되며, 이를 변환하지 않고 외부 메모리로 출력하면 바이너리 파일로 메모리에 저장된 데이터의 이미지라고 볼 수 있으므로 이미지 파일이라고도 한다. . 외부 저장소에 아스키 코드 형태로 저장해야 하는 경우 변환 후 저장해야 합니다. ASCII 파일은 텍스트 파일이라고도 하며 각 바이트는 문자의 ASCII 코드를 저장합니다.

4. 파일 버퍼

         ANSI C 표준은 데이터 파일을 처리하기 위해 "버퍼 파일 시스템"을 사용합니다. 소위 버퍼 파일 시스템은 시스템이 프로그램에서 사용되는 각 파일에 대해 메모리 영역에 파일 버퍼를 자동으로 생성한다는 것을 의미합니다. 메모리에서 디스크로 출력되는 데이터는 먼저 메모리에 있는 버퍼로 보내고 버퍼가 가득 차면 함께 디스크로 보내야 한다. 디스크에서 컴퓨터로 데이터를 읽으면 디스크 파일에서 메모리 버퍼(풀 버퍼)로 데이터 배치가 입력되고 버퍼에서 프로그램 데이터 영역으로 데이터가 하나씩 전송됩니다. 프로그램 변수). 이것은 액세스 시간을 절약하고 효율성을 향상시키기 위해 수행되며 버퍼의 크기는 각 특정 C 컴파일 시스템에 의해 결정됩니다.

        설명 : 각 파일의 메모리에는 하나의 버퍼만 존재하며 파일로 데이터를 출력할 때 출력 버퍼로 사용하고 파일에서 데이터를 입력할 때 입력 버퍼로 사용합니다.

5. 파일 형식 포인터 

        캐시 파일 시스템에서 핵심 개념은 "파일 포인터"라고 하는 "파일 유형 포인터"입니다. 사용된 각 파일은 메모리에서 해당 파일 정보 영역을 열어 파일의 관련 정보(예: 파일 이름, 파일 상태 및 파일의 현재 위치 등)를 저장하는 데 사용됩니다. . 이 정보는 구조체 변수에 저장됩니다. 구조 유형은 시스템에 의해 선언되고 이름은 FILE입니다.

typedef struct
{	short level;				//缓冲区“满”或“空”的程度
	unsigned flags;			//文件状态标志
	char fd;					//文件描述符
	unsigned char hold; 		//如缓冲区无内容不读取字符
	short bsize;				//缓冲区的大小
	unsigned char*buffer;	//数据缓冲区的位置
	unsigned char*curp;		//文件位置标记指针当前的指向
	unsigned istemp;		//临时文件指示器
	short token;				//用于有效性检查
}FILE;
FILE *fp;
//定义一个指向FILE类型数据的指针变量

         fp가 특정 파일의 파일 정보 영역(구조 변수)을 가리키도록 할 수 있으며 파일 정보 영역의 정보를 통해 파일에 액세스할 수 있습니다. 즉, 연결된 파일은 파일 포인터 변수를 통해 찾을 수 있습니다. n개의 파일이 있는 경우 n개의 파일에 대한 액세스를 실현하려면 n개의 포인터 변수가 n개의 FILE 유형 변수를 가리키도록 설정해야 합니다. 편의상 이러한 파일 정보 영역을 가리키는 포인터 변수를 보통 파일을 가리키는 포인터 변수라고 한다.

2. 파일 열기 및 닫기

1. 파일 열기 및 닫기

        파일은 읽거나 쓰기 전에 "열어야" 하고 사용 후에는 "닫아야" 합니다. 소위 "열기"는 파일에 대한 해당 정보 영역(파일에 대한 정보를 저장하는 데 사용됨) 및 파일 버퍼(입력 및 출력 데이터를 임시로 저장하는 데 사용됨)를 설정하는 것을 말합니다. 프로그램을 작성할 때 파일을 열 때 일반적으로 파일을 가리키는 포인터 변수를 지정합니다. 즉, 포인터 변수와 파일 간의 연결을 설정하여 포인터 변수를 통해 파일을 읽고 쓸 수 있습니다. 소위 "닫기"는 파일 정보 영역과 파일 버퍼를 취소하여 파일 포인터 변수가 더 이상 파일을 가리키지 않고 분명히 파일을 읽거나 쓸 수 없도록 하는 것을 말합니다.

2. fopen 함수로 데이터 파일 열기 


fopen(파일명, 파일모드 사용);


FILE *fp;				//定义一个指向文件的指针变量fp
fp=fopen(″a1″,″r″);	//将fopen函数的返回值赋给指针变量fp

 파일을 열 때 다음 세 가지 정보를 컴파일 시스템에 알립니다.

① 열려는 파일명, 즉 접근할 파일명

② 파일 사용 방법("읽기" 또는 "쓰기" 등)

③ 어떤 포인터 변수가 열린 파일을 가리키도록 하십시오.

 사용 파일

파일 사용

의미

지정한 파일이 존재하지 않는 경우

"r"(읽기 전용)

데이터를 입력하려면 기존 텍스트 파일을 여십시오.

잘못

"w"(쓰기 전용)

데이터를 출력하려면 텍스트 파일을 엽니다.

새 파일 만들기

“a”(추가)

텍스트 파일 끝에 데이터 추가

잘못

"rb"(읽기 전용)

데이터를 입력하려면 바이너리 파일을 여십시오.

잘못

"wb"(쓰기 전용)

데이터를 출력하려면 바이너리 파일을 엽니다.

새 파일 만들기

“ab”(추가)

바이너리 파일 끝에 데이터 추가

잘못

"r+"(읽기 및 쓰기)

읽기 및 쓰기용 텍스트 파일 열기

잘못

"w+"(읽기 및 쓰기)

읽기 및 쓰기를 위한 새 텍스트 파일 만들기

새 파일 만들기

"a+"(읽기 및 쓰기)

읽기 및 쓰기용 텍스트 파일 열기

잘못

"rb+"(읽기 및 쓰기)

읽기 및 쓰기용 바이너리 파일 열기

잘못

"wb+"(읽기 및 쓰기)

읽기 및 쓰기를 위한 새 이진 파일 만들기

새 파일 만들기

"ab+"(읽기 및 쓰기)

읽기 및 쓰기용 바이너리 파일 열기

잘못

(1) "r" 모드로 열린 파일은 컴퓨터로의 입력용으로만 사용할 수 있고 파일로의 데이터 출력용으로는 사용할 수 없으며 파일이 이미 존재하고 데이터를 포함하고 있어야 프로그램이 파일에서 데이터를 읽을 수 있습니다. "r" 모드에서 존재하지 않는 파일을 열 수 없습니다. 그렇지 않으면 오류가 발생합니다.

(2) "w"로 열린 파일은 파일(즉, 출력 파일)에 데이터를 쓰는 데만 사용할 수 있지만 컴퓨터에 입력하는 데는 사용할 수 없습니다. 파일이 존재하지 않으면 파일을 열기 전에 지정된 이름으로 새 파일을 생성하십시오. 이 파일 이름으로 명명된 파일이 이미 있으면 파일을 열기 전에 파일을 삭제한 다음 새 파일을 만드십시오.

(3) 파일 끝에 새 데이터를 추가하려면(원래 데이터를 삭제하지 않으려면) "a"로 파일을 열어야 합니다. 그러나 이때 파일이 이미 존재하는지 확인해야 하며, 그렇지 않으면 오류 메시지가 표시됩니다. 묵시적인 "파일 읽기 및 쓰기 위치 표시"는 각 데이터 파일에 자동으로 설정되며 그것이 가리키는 위치는 현재 읽기 및 쓰기 위치입니다. "파일 읽기 및 쓰기 위치 표시"가 파일의 시작 부분에 있는 경우 다음 읽기 및 쓰기는 파일 시작 부분의 데이터입니다. 그러면 "파일 읽기 및 쓰기 위치 표시"가 자동으로 다음 읽기 및 쓰기 위치로 이동하여 다음 데이터를 읽고 쓸 수 있습니다. 추가를 위해 파일을 열면 파일 읽기/쓰기 표시가 파일 끝으로 이동됩니다. (4) "r+", "w+" 및 "a+"로 열린 파일은 입력 및 출력 데이터 모두에 사용할 수 있습니다.

(5) "열기" 작업을 실현할 수 없는 경우 fopen 함수는 널 포인터 값 NULL을 반환합니다.

(6) C 표준은 텍스트 파일이나 바이너리 파일을 열기 위해 표 10.1에 나열된 파일 사용 방법을 사용하도록 권장하지만 현재 사용 중인 일부 C 컴파일 시스템은 이러한 기능을 모두 제공하지 않을 수 있으며 다음 규정에 주의해야 합니다. 사용되는 시스템.

(7) 12개의 파일 사용 방법이 있으며, 그 중 6개는 첫 번째 문자 뒤에 문자 b를 추가합니다(예: rb, wb, ab, rb+, wb+, ab+). b는 바이너리 모드를 의미합니다. 사실, b가 있는 것과 b가 없는 것 사이에는 단 하나의 차이점, 즉 개행 처리가 있습니다. 줄 바꿈은 C 언어에서 '\n'으로 구현할 수 있으므로 Windows 시스템에서 줄 바꿈을 구현하려면 "캐리지 리턴"과 "줄 바꿈"의 두 문자, 즉 '\r'을 사용해야 합니다. ' 및 '\n'. 따라서 텍스트 파일을 사용하여 "w"로 여는 경우 파일로 출력할 때 개행 문자 '\n'을 만나면 시스템에서 두 문자 '\r' 및 '\n'으로 변환합니다. , 그렇지 않으면 Windows 시스템에서 파일을 볼 때 각 라인이 하나로 연결되어 읽을 수 없습니다. 마찬가지로 텍스트 파일이 있고 "r"로 열면 파일에서 읽을 때 '\r'과 '\n' 두 개의 연속 문자가 나타나면 하나의 문자 '\n'으로 변환합니다. 바이너리 파일을 사용하는 경우 파일을 읽고 쓸 때 이러한 변환이 필요하지 않습니다. b를 추가하면 바이너리 파일이 사용되며 시스템에서 변환하지 않음을 의미합니다.

(8) "wb" 파일 사용 방법을 사용한다고 해서 ASCII 형식으로 메모리에 저장된 데이터가 파일 출력 시 자동으로 바이너리 형식으로 변환되는 것은 아닙니다. 출력 데이터 형식은 프로그램에서 사용되는 읽기 및 쓰기 문에 의해 결정됩니다. 예를 들어 fscanf 및 fprintf 함수는 ASCII 모드에서 입력 및 출력에 사용되는 반면 fread 및 fwrite 함수는 이진 입력 및 출력에 사용됩니다.

(9) 프로그램에서 표준 입력 스트림, 표준 출력 스트림 및 표준 오류 출력 스트림의 세 가지 표준 스트림 파일을 사용할 수 있습니다. 시스템은 이 3개의 파일에 대해 터미널과의 해당 관계를 지정했습니다. 표준 입력 스트림은 터미널의 입력이고, 표준 출력 스트림은 터미널로의 출력이며, 표준 오류 출력 스트림은 프로그램이 실패했을 때 터미널로 전송되는 오류 메시지입니다. 프로그램이 실행되기 시작하면 시스템이 이 3개의 표준 스트림 파일을 자동으로 엽니다.

3. fclose 함수로 데이터 파일 닫기


                                fclose(파일 포인터);fclose(fp); 


        파일은 오용되지 않도록 사용 후 닫아야 합니다. "닫기"는 파일 정보 영역과 파일 버퍼를 취소하여 파일 포인터 변수가 더 이상 파일을 가리키지 않도록 하는 것입니다. 즉, 파일 포인터 변수가 파일에서 "분리"되고 원래 연결된 파일을 읽을 수 없습니다. 또는 포인터를 통해 작성됨 작업은 다시 열리지 않는 한 포인터 변수가 파일을 다시 가리키도록 합니다. 파일을 닫지 않고 프로그램을 종료하면 데이터가 손실됩니다. 파일에 데이터를 쓸 때 데이터가 먼저 버퍼에 출력되고 버퍼가 가득 찰 때까지 공식적으로 파일에 출력되지 않기 때문입니다. 버퍼가 데이터로 채워지지 않은 상태에서 프로그램이 종료되면 버퍼의 데이터가 손실될 수 있습니다.

        fclose 함수를 사용하여 파일을 닫을 때는 먼저 버퍼에 있는 데이터를 디스크 파일로 출력한 다음 파일 정보 영역을 취소하십시오. 일부 컴파일 시스템은 프로그램이 종료되기 전에 자동으로 버퍼의 데이터를 파일에 기록하므로 이 문제를 피할 수 있지만 프로그램이 종료되기 전에 모든 파일을 닫는 습관을 길러야 합니다. fclose 함수도 값을 반환하는데, 닫기 작업이 성공적으로 수행되면 반환값은 0이고 그렇지 않으면 EOF(-1)가 반환된다. 

3. 데이터 파일의 순차적 읽기 및 쓰기

1. 파일에서 문자를 읽고 쓰는 방법

 문자를 읽고 쓰는 기능

함수 이름

전화 양식

기능

반환 값

fgetc

fgetc(fp)

fp가 가리키는 파일에서 문자를 읽습니다.

읽기에 성공하면 읽은 문자를 다시 가져오고 실패하면 파일 끝 플래그 EOF(예: -1)를 반환합니다.

fputc

fputc(ch,fp)

파일 포인터 변수 fp가 가리키는 파일에 문자 ch를 씁니다.

출력이 성공하면 반환 값은 출력 문자이고, 출력이 실패하면 EOF(예: -1)를 반환합니다.

        fgetc의 첫 번째 문자 f는 파일(file), 가운데 get은 "get", 마지막 문자 c는 문자(character)를 의미합니다. fgetc의 의미는 매우 명확합니다. 파일에서 문자를 읽습니다. fputc도 비슷합니다. 

예 1

        키보드에서 일부 문자를 입력하고 사용자가 "#"을 입력할 때까지 하나씩 디스크로 보냅니다. 

#include <stdio.h>
#include <stdlib.h>
int main()
{	FILE *fp;                     				//定义文件指针fp
	char ch,filename[10];
	printf("请输入所用的文件名: ");   
	scanf("%s",filename);        			//输入文件名
	getchar();                  		 		//用来消化最后输入的回车符
	if((fp=fopen(filename,"w"))==NULL)	//打开输出文件并使fp指向此文件
	{	printf("cannot open file\n");  	//如果打开出错就输出“打不开”
		exit(0);                       			//终止程序
	}
	printf("请输入一个准备存储到磁盘的字符串(以#结束): ");
	ch=getchar();        					//接收从键盘输入的第一个字符
	while(ch!='#')        					//当输入′#′时结束循环
	{	fputc(ch,fp); 					//向磁盘文件输出一个字符
		putchar(ch);					//将输出的字符显示在屏幕上
		ch=getchar(); 					//再接收从键盘输入的一个字符
	}
	fclose(fp);						//关闭文件
	putchar(10); 						//向屏幕输出一个换行符 
	return 0;
}

예 2

        한 디스크 파일에서 다른 디스크 파일로 정보를 복사합니다. 이제 위의 예에서 만든 file1.dat 파일의 내용을 다른 디스크 파일 file2.dat에 복사해야 합니다.

#include <stdio.h>
#include <stdlib.h>
int main()
{	FILE *in,*out; 						//定义指向FILE类型文件的指针变量
	char ch,infile[10],outfile[10];			//定义两个字符数组,分别存放两个数据文件名
	printf("输入读入文件的名字:");
	scanf("%s",infile);					//输入一个输入文件的名字
	printf("输入输出文件的名字:");
	scanf("%s",outfile); 					//输入一个输出文件的名字
	if((in=fopen(infile,"r"))==NULL)		//打开输入文件
	{	printf("无法打开此文件\n");	exit(0);	}
	if((out=fopen(outfile,"w"))==NULL)	//打开输出文件
	{	printf("无法打开此文件\n");	exit(0);	}
	ch=fgetc(in);          				//从输入文件读入一个字符,赋给变量ch
	while(!feof(in))       					//如果未遇到输入文件的结束标志
	{	fputc(ch,out);      				//将ch写到输出文件
		putchar(ch);        				//将ch显示到屏幕上
		ch=fgetc(in);       				//再从输入文件读入一个字符,赋给变量ch
	}
	putchar(10);						//显示完全部字符后换行
	fclose(in); 						//关闭输入文件
	fclose(out);						//关闭输出文件
	return 0;
}

 문자열을 읽고 쓰는 함수

함수 이름

전화 양식

기능

반환 값

fgets

fgets(str,n,fp)

fp가 가리키는 파일에서 길이(n-1)의 문자열을 읽고 문자 배열 str에 저장합니다.

읽기에 성공하면 주소 str을 반환하고 실패하면 NULL을 반환합니다.

fputs

fputs(str,fp)

str이 가리키는 문자열을 파일 포인터 변수 fp가 가리키는 파일에 씁니다.

출력이 성공하면 0을 반환하고 그렇지 않으면 0이 아닌 값을 반환합니다.

        fgets의 마지막 문자 s는 문자열(문자열)을 나타냅니다. fgets의 의미는 다음과 같습니다. 파일에서 문자열을 읽습니다. 

2. 파일에 문자열을 읽고 쓰는 방법 

fgets 함수의 함수 프로토타입은 다음과 같습니다. char *fgets(char *str, int n, FILE *fp);

그 역할은 파일에서 문자열을 읽는 것입니다. 호출은 다음 형식으로 작성할 수 있습니다.

fgets(str,n,fp);

        그 중 n은 필요한 문자의 개수인데, 실제로는 fp가 가리키는 파일에서 n-1개의 문자만 읽은 다음 끝에 '\0' 문자를 추가하여 결과 문자열의 총합을 갖는다. n 문자 중 문자 배열 str에 넣습니다. n-1개의 문자를 읽기 전에 개행 문자 "\n" 또는 파일 끝 문자 EOF를 만나면 읽기가 종료되지만 만난 개행 문자 "\n"도 문자로 읽습니다. fgets 함수의 실행이 성공하면 반환값은 str 배열의 첫 번째 원소의 주소이고 처음에 파일의 끝을 만나거나 데이터를 읽는 중 오류가 발생하면 NULL을 반환한다.

fputs 함수의 함수 원형은 int fputs(char *str, FILE *fp)입니다.

그 기능은 str이 가리키는 문자열을 fp가 가리키는 파일로 출력하는 것입니다. 로 쓸 수 있습니다

fputs("중국",fp);

        fp가 가리키는 파일에 문자열 "China"를 출력합니다. fputs 함수의 첫 번째 매개변수는 문자열 상수, 문자 배열 이름 또는 문자 포인터일 수 있습니다. 문자열 끝의 '\0'은 출력되지 않습니다. 출력이 성공하면 함수 값은 0이고 실패하면 함수 값은 EOF(예: -1)입니다.

        fgets 및 fputs의 기능은 get 및 puts가 터미널을 읽기 및 쓰기 개체로 사용하는 반면 fgets 및 fputs는 지정된 파일을 읽기 및 쓰기 개체로 사용한다는 점을 제외하면 get 및 puts의 기능과 유사합니다.

예 3

        키보드에서 여러 문자열을 읽고 알파벳 순서로 정렬한 다음 정렬된 문자열을 저장을 위해 디스크 파일로 보냅니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
int main()
{	FILE *fp;
	char str[3][10],temp[10];
	//str是用来存放字符串的二维数组,temp是临时数组
	int i,j,k,n=3;
	printf("Enter strings:\n");	//提示输入字符串
	for(i=0;i<n;i++) 
		gets(str[i]);			//输入字符串
	for(i=0;i<n-1;i++)			//用选择法对字符串排序
	{	k=i;
		for(j=i+1;j<n;j++)
			if(strcmp(str[k],str[j])>0) k=j;
		if(k!=i)
		{	strcpy(temp,str[i]);
			strcpy(str[i],str[k]);
			strcpy(str[k],temp);}
	}
	if((fp=fopen("D:\\CC\\string.dat","w"))==NULL)	//打开磁盘文件
	//′\′为转义字符的标志,因此在字符串中要表示′\′用′\\′
	{
		printf("can′t open file!\n");
		exit(0);
	}
	printf("\nThe new sequence:\n");
	for(i=0;i<n;i++)
	{	fputs(str[i],fp);fputs("\n",fp);
		//向磁盘文件写一个字符串,然后输出一个换行符
		printf("%s\n",str[i]);		//在屏幕上显示
	}
	return 0;
}

3. 형식화된 방식으로 텍스트 파일 읽기 및 쓰기 

        파일의 입력과 출력을 포맷할 수 있습니다. 그들의 기능은 printf 기능 및 scanf 기능과 유사하며 둘 다 형식이 지정된 읽기 및 쓰기 기능입니다. 한 가지 차이점이 있습니다. fprintf 및 fscanf 함수의 읽기 및 쓰기 개체는 터미널이 아니라 파일입니다. 그들은 일반적으로 다음과 같이 불립니다.


                                        fprintf(파일 포인터, 형식 문자열, 출력 목록);

                                        fscanf(파일 포인터, 형식 문자열, 입력 목록);


fprintf (fp,″%d,%6.2f″,i,f);	//将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中

fscanf (fp,″%d,%f″,&i,&f);
//磁盘文件上如果有字符“3,4.5”,则从中读取整数3送给整型变量i,读取实数4.5送给float型变量f

4. 바이너리 모드에서 파일에 데이터 세트 읽기 및 쓰기

         C 언어에서는 fread 함수를 사용하여 파일에서 데이터 블록을 읽고 fwrite 함수를 사용하여 파일에 데이터 블록을 쓸 수 있습니다. 읽고 쓸 때 바이너리 형식으로 수행됩니다. 디스크에 데이터를 쓸 때 메모리에 있는 데이터 그룹을 변환하지 않고 디스크 파일에 직접 복사하고, 읽을 때 디스크 파일의 여러 바이트의 내용도 일괄적으로 메모리로 읽습니다.

fread(버퍼, 크기, 개수, fp);

fwrite(버퍼, 크기, 개수, fp);

버퍼: 주소입니다. fread의 경우 파일에서 읽은 데이터를 저장하는 데 사용되는 메모리 영역의 주소입니다. fwrite의 경우 이 주소에서 시작하여 저장 영역의 데이터를 파일로 출력하는 것입니다(위는 시작 주소를 나타냅니다).

크기: 읽고 쓸 바이트 수.

count: 읽고 쓸 데이터 항목 수(각 데이터 항목의 길이는 크기임).

fp: FILE 유형 포인터. 

5. 주의 읽기

(1) 데이터 저장 방식 텍스트 방식: 데이터를 문자 모드(ASCII 코드)로 파일에 저장합니다. 예를 들어 정수 12는 파일로 보낼 때 4바이트가 아닌 2바이트를 차지합니다. 텍스트 형식으로 저장된 데이터는 읽기 쉽습니다. 바이너리 모드: 데이터가 메모리에 저장될 때 파일에 복사됩니다. 예를 들어 정수 12는 파일과 메모리에 보낼 때 4바이트를 차지합니다.

(2) 파일 분류 텍스트 파일(ASCII 파일): 모든 파일이 ASCII 문자입니다. 바이너리 파일: 메모리에 있는 데이터를 바이너리 방식으로 파일에 복사하는 것을 바이너리 파일, 즉 이미지 파일이라고 합니다.

(3) 파일 열기 방법 텍스트 방법: b가 없는 방법, 파일을 읽고 쓸 때 개행 문자가 변환됩니다. 바이너리 모드: b가 있는 모드에서는 파일을 읽고 쓸 때 개행 문자가 변환되지 않습니다.

(4) 파일 읽기 및 쓰기 기능 텍스트 읽기 및 쓰기 기능: 텍스트 파일에 문자 데이터를 읽고 쓰는 데 사용되는 기능(예: fgetc, fgets, fputc, fputs, fscanf, fprintf 등). 이진 읽기 및 쓰기 기능: 이진 데이터를 이진 파일에 읽고 쓰는 데 사용되는 기능(예: getw, putw, fread, fwrite 등).

4. 임의로 데이터 파일 읽기 및 쓰기

        파일의 순차적인 읽기와 쓰기는 상대적으로 이해하기 쉽고 조작하기 쉽지만 때로는 효율적이지 않습니다. 랜덤 액세스는 파일 내 데이터의 물리적 위치 순서에 따라 읽고 쓰는 것이 아니라 임의의 위치에 있는 데이터에 액세스할 수 있으므로 순차 액세스보다 훨씬 효율적임은 분명합니다.

1. 파일 위치 표시 및 위치 지정

1. 파일 위치 마커

        읽기 및 쓰기를 제어하기 위해 시스템은 파일마다 파일 읽기 및 쓰기 위치 표시(파일 위치 표시 또는 파일 표시라고 함)를 설정합니다. 다음". 정상적인 상황에서 문자 파일을 순차적으로 읽고 쓸 때 파일 위치 표시는 파일의 시작 부분을 가리키며, 이때 파일을 읽고/쓰면 첫 번째 문자를 읽고/쓴 후 파일의 순서가 위치 마크가 뒤로 이동 위치, 다음 읽기/쓰기 작업을 수행할 때 위치 마크가 가리키는 두 번째 문자를 읽거나 씁니다. 이런 식으로 파일이 끝날 때까지 이 때 파일 위치 표시는 마지막 데이터 뒤에 있습니다. 스트리밍 파일은 순차적으로 또는 무작위로 읽고 쓸 수 있습니다. 핵심은 파일의 위치 표시를 제어하는 ​​것입니다. 파일 위치 마크를 바이트 위치 순서대로 이동하면 순차 읽기와 쓰기가 된다. 파일 위치 표시를 필요에 따라 임의의 위치로 이동할 수 있으면 임의 읽기 및 쓰기가 가능합니다. 소위 임의 읽기 및 쓰기는 이전 문자(바이트)를 읽고 쓴 후 후속 문자(바이트)를 읽고 쓸 필요가 없지만 임의의 위치에서 필요한 문자(바이트)를 읽고 쓸 수 있음을 의미합니다. 파일에서. ). 즉, 파일에 데이터를 읽고 쓰는 순서는 일반적으로 파일에 있는 데이터의 물리적 순서와 일치하지 않습니다. 데이터는 어디에서나 쓸 수 있고 데이터는 어디에서나 읽을 수 있습니다.

2. 파일 위치 마크의 위치 지정 

        되감기 기능을 사용하여 파일 위치 표시가 파일의 시작 부분을 가리키도록 합니다. 되감기 기능의 기능은 파일 위치 표시가 파일의 시작 부분으로 돌아가도록 하는 것입니다. 이 기능은 반환 값이 없습니다.

        파일 위치 표시, fseek(파일 형식 포인터, 변위, 시작점)을 변경하려면 fseek 함수를 사용합니다. fseek 함수는 일반적으로 바이너리 파일에 사용됩니다.

fseek (fp,100L,0);		//将文件位置标记向前移到离文件开头100个字节处
fseek (fp,50L,1); 		//将文件位置标记向前移到离当前位置50个字节处
fseek (fp,-10L,2);		//将文件位置标记从文件末尾处向后退10个字节

        ftell 함수를 사용하여 파일 위치 표시의 현재 위치를 측정합니다. ftell 함수의 기능은 스트리밍 파일에서 파일 위치 표시의 현재 위치를 가져오는 것입니다. 이 위치는 파일 시작 부분에 상대적인 변위로 표시됩니다. . 함수를 호출할 때 오류가 발생하면(예를 들어 fp가 가리키는 파일이 존재하지 않는 경우) ftell 함수의 반환 값은 -1L입니다.

        일부 정보가 포함된 디스크 파일이 있습니다. 처음으로 내용을 화면에 표시하고 두 번째로 다른 파일로 복사해야 합니다.

#include<stdio.h>
int main()
{	char ch;
	FILE *fp1,*fp2;
	fp1=fopen("file1.dat","r");	//打开输入文件
	fp2=fopen("file2.dat","w");	//打开输出文件
	ch=getc(fp1);				//从file1.dat文件读入第一个字符
	while(!feof(fp1))			//当未读取文件尾标志
	{	putchar(ch);			//在屏幕输出一个字符
		ch=getc(fp1);			//再从file1.dat文件读入一个字符
	}
	putchar(10);				//在屏幕执行换行
	rewind(fp1);				//使文件位置标记返回文件开头
	ch=getc(fp1);				//从file1.dat文件读入第一个字符
	while(!feof(fp1))			//当未读取文件尾标志
	{	fputc(ch,fp2);			//向file2.dat文件输出一个字符
		ch=fgetc(fp1);			//再从file1.dat文件读入一个字符
	}
	fclose(fp1);fclose(fp2);
	return 0;
}

5. 파일 읽기 및 쓰기 오류 감지

1. 오류 함수 

 ferror(fp);

        각종 입출력 함수(예: putc, getc, fread, fwrite 등)를 호출할 때 오류가 발생하면 함수 반환 값의 반영 외에도 ferror 함수를 사용하여 확인할 수도 있습니다. ferror가 0(거짓) 값을 반환하면 오류가 발생하지 않았음을 의미하고, 0이 아닌 값을 반환하면 오류가 발생했음을 의미합니다. 

2. 명확한 기능 

        clearerr의 역할은 파일 오류 플래그와 파일 끝 플래그를 0으로 설정하는 것입니다. 입출력 함수를 호출하는 동안 오류가 발생했다고 가정하면 ferror 함수는 0이 아닌 값으로 평가됩니다. 다음 감지를 위해 ferror(fp)의 값이 0이 되도록 clearerr(fp)를 즉시 호출해야 합니다. 파일 읽기 및 쓰기 오류 플래그가 표시되는 한 동일한 파일에서 clearerr 함수 또는 되감기 함수 또는 다른 입력 및 출력 함수가 호출될 때까지 남아 있습니다.

알아채다

        동일한 파일에 대한 입/출력 함수에 대한 각 호출은 ferror 함수의 새 값을 생성하므로 ferror 함수의 값은 입/출력 함수를 호출한 직후에 확인해야 합니다. 그렇지 않으면 정보가 손실됩니다. fopen 함수가 실행되면 ferror 함수의 초기값은 자동으로 0으로 설정됩니다.

추천

출처blog.csdn.net/m0_63794226/article/details/126673668