C语言编写文件操作的程序应该遵循以下步骤:

  1. 定义文件指针
  2. 打开文件:文件指针指向磁盘文件缓冲区
  3. 文件处理:文件的读写操作
  4. 关闭文件

文件类型指针(FILE 类型指针)

FILE 类型指针是 C 语言中用于操作文件的指针。
它是标准库 stdio.h 中定义的一个结构体类型,用来表示一个文件流。通过这个指针,你可以访问文件,进行读写操作等

FILE * file;  // 定义一个文件指针
Copied!

文件的打开与关闭(fopen,fclose)

fopen()函数

打开文件由标准函数fopen()实现,其一般调用方式为:

fopen("文件名","文件的打开方式");
Copied!
文件名:
文件的打开方式:
当文本文件为ASCII编码
当文件为二进制文件
下面两种方法都以只读的方式打开abc.txt文件:
  1. fp=fopen("abc.txt","r"); \\用字符串常量表示文件,最常用!
  2. char *p="abc.txt"; fp=fopen(p,"r"); \\用字符指针表示文件
一般对文件进行读写操作的时候常用到一下规则:
//读文件
if((fp=fopen("abc.txt","r"))==NULL){
	printf("文件打开失败!\n");
	exit(0);  \\关闭所有打开的文件并终止程序运行
}
fclose(fp);
//写文件
if((fp=fopen("abc.txt","w"))==NULL){
	printf("文件打开失败!\n");
	exit(0);  \\关闭所有打开的文件并终止程序运行
}
fclose(fp);
//追写文件
if((fp=fopen("abc.txt","a"))==NULL){
	printf("文件无法打开!\n");
	exit(0);
}
fclose(fp);
Copied!

fclose()函数

当文件操作完成后应该及时的关闭它以防止不正常的操作,关闭文件通过调用标准函数fclose()
来实现,其一般格式为:

fclose(文件指针);
Copied!

该函数将返回一个整数,若返回0则表示正常关闭文件,否则表示无法正常关闭文件。

if(fclose(fp)){
	printf("无法正常关闭文件!\n");
	exit(0);
}
Copied!

文件的读写

fputc()函数

将一个字符写入指定的文件流,其一般调用方式为:

fputc('要写入的字符',文件指针);
Copied!

成功时返回写入的字符(unsigned char 转换为 int 类型),失败时返回 EOF
示例:

FILE *fp = fopen("file.txt", "w");
fputc('A', fp);  // 将字符 'A' 写入文件
fclose(fp);
Copied!

fgetc()函数

从文件中读取下一个字符,其一般调用方式为:

fgetc(文件指针);
Copied!

成功时返回读取的字符,失败或文件结束时返回 EOF
示例:

FILE *fp = fopen("file.txt", "r");
char ch = fgetc(fp);  // 从文件中读取一个字符
fclose(fp);
Copied!

fputs()函数

将一个字符串写入到指定的文件,其一般调用方式为:

fputs("要写入的字符串",文件指针);
Copied!

成功时返回非负值,失败时返回 EOF
示例:

FILE *fp = fopen("file.txt", "w");
fputs("Hello, World!", fp);  // 将字符串写入文件
fclose(fp);
Copied!

fgets()函数

从文件中读取一行,最多读取 n-1 个字符,自动添加终止符 '\0',其一般调用方式为:

fgets(用来存储读取内容的字符数组str,最大读取字符数n,文件指针);
Copied!

成功时返回 str,文件结束时返回 NULL,读取出错时返回 NULL
示例:

FILE *fp = fopen("file.txt", "r");
char str[100];
fgets(str, 100, fp);  // 从文件读取一行
fclose(fp);
Copied!

fread()函数

从文件中读取 count 个元素,每个元素的大小为 size 字节,存入 ptr 指向的内存区域。其一般调用方式为:

fread(存储数据的内存区域,每个元素的大小,要读取的元素数量,文件指针);
Copied!

成功时返回实际读取的元素数量,如果读取出错或到达文件末尾,返回值小于 count
示例:

FILE *fp = fopen("file.bin", "rb");
int buffer[10];
fread(buffer, sizeof(int), 10, fp);  // 从二进制文件读取 10 个整数
fclose(fp);
Copied!

fwrite()函数

count 个元素(每个大小为 size 字节)从内存写入文件,其一般调用方式为:

fwrite(要写入数据的内存区域,每个元素的大小,要写入的元素数量,文件指针);
Copied!

成功时返回实际写入的元素数量,失败时返回小于 count 的值。
示例:

FILE *fp = fopen("file.bin", "wb");
int buffer[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
fwrite(buffer, sizeof(int), 10, fp);  // 将 10 个整数写入二进制文件
fclose(fp);
Copied!

fprintf()函数

将格式化的数据写入到文件中,类似于 printf,但是输出到文件,其一般调用形式为:

fprintf(文件指针,"要写入的内容");
Copied!

成功时返回写入的字符数,失败时返回负值。
示例:

FILE *fp = fopen("file.txt", "w");
fprintf(fp, "Number: %d, Pi: %.2f\n", 42, 3.14159);  // 格式化写入数据
fprintf(fp,"写入一个字符串");
fclose(fp);
Copied!

fscanf()函数

从文件中按格式读取数据,类似于 scanf,但输入来源是文件,其一般调用形式为:

fscanf(文件指针,"格式化字符串",...);
Copied!

成功时返回成功读取的项目数,失败时返回 EOF
示例:

#include<stdio.h>
#include<stdlib.h>
int main(){
	FILE *fp = fopen("file.txt", "r");
	if(fp==NULL){
		printf("文件不存在!\n");
		exit(0); 
	}
	int num;
	float pi;
	char a[999];
	fscanf(fp, "Number: %d, Pi: %f", &num, &pi);  // 格式化读取数据
	fscanf(fp,"%s",&a); 
	fclose(fp);
	printf("Number=%d,PI=%f,String=%s\n",num,pi,a);
	return 0;
}
被读取文件的内容为Number: 42, Pi: 3.14
这是一串字符串
Copied!

文件的定位

fseek()函数

设置文件指针的具体位置,其一般调用方式如下:

fseek(文件指针,偏移量,起始位置);
Copied!
#include <stdio.h>
#include<stdlib.h>
int main() {
    FILE *fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(0);
    }
    fseek(fp, 10, SEEK_SET);    // 将文件指针移动到文件的第10个字节
    fseek(fp, 5, SEEK_CUR);    // 从当前文件指针位置向后移动5个字节
    fseek(fp, -10, SEEK_END); // 从文件末尾向前移动10个字节
    char ch = fgetc(fp);     // 在新的位置读取文件内容
    printf("读取的字符: %c\n", ch);
    fclose(fp);
    return 0;
}
Copied!

rewind()函数

将文件指针重置到文件的开头,其一般调用形式为:

rewind(文件指针);
Copied!

没有返回值
示例:

#include <stdio.h>
#include?<stdlib.h>
int main() {
    FILE *fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(0);
    }
    fseek(fp, 0, SEEK_END);// 将文件指针移动到文件的末尾
    rewind(fp);           // 重置文件指针到文件的开头
    char ch = fgetc(fp); // 读取文件的第一个字符
    printf("读取的字符: %c\n", ch);
    fclose(fp);
    return 0;
}
Copied!