C语言编写文件操作的程序应该遵循以下步骤:
- 定义文件指针
- 打开文件:文件指针指向磁盘文件缓冲区
- 文件处理:文件的读写操作
- 关闭文件
文件类型指针(FILE 类型指针)
FILE 类型指针是 C 语言中用于操作文件的指针。
它是标准库 stdio.h 中定义的一个结构体类型,用来表示一个文件流。通过这个指针,你可以访问文件,进行读写操作等
FILE * file; // 定义一个文件指针
文件的打开与关闭(fopen,fclose)
fopen()函数
打开文件由标准函数fopen()
实现,其一般调用方式为:
fopen("文件名","文件的打开方式");
文件名:
- 如何不写出路径,则默认与应用程序的当前路径
- 如果需要写出路径,目录的
"\"
需要用双斜杠"\\"
,如"C:\\abc.txt"
文件的打开方式:
当文本文件为ASCII编码
"r"
:打开文本文件进行只读"w"
:建立新文本文件进行只写"a"
:打开文本文件进行追加"r+"
:打开文本文件进行读/写 (必须文件存在)"w+"
:建立新文本文件进行读/写 (会清空文件内容)"a+"
:打开文本文件进行读/写/追加 (内容追加到末尾)
当文件为二进制文件
"rb"
:打开二进制文件进行只读"wb"
:建立新二进制文件进行只写"ab"
:打开二进制文件进行追加"rb+"
:打开二进制文件进行读/写 (必须文件存在)"wb+"
:建立新二进制文件进行读/写 (会清空文件内容)"ab+"
:打开二进制文件进行读/写/追加 (内容追加到末尾)
下面两种方法都以只读的方式打开abc.txt文件:
fp=fopen("abc.txt","r"); \\用字符串常量表示文件,最常用!
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);
fclose()函数
当文件操作完成后应该及时的关闭它以防止不正常的操作,关闭文件通过调用标准函数fclose()
来实现,其一般格式为:
fclose(文件指针);
该函数将返回一个整数,若返回0则表示正常关闭文件,否则表示无法正常关闭文件。
if(fclose(fp)){
printf("无法正常关闭文件!\n");
exit(0);
}
文件的读写
fputc()函数
将一个字符写入指定的文件流,其一般调用方式为:
fputc('要写入的字符',文件指针);
成功时返回写入的字符(unsigned char
转换为 int
类型),失败时返回 EOF
。
示例:
FILE *fp = fopen("file.txt", "w");
fputc('A', fp); // 将字符 'A' 写入文件
fclose(fp);
fgetc()函数
从文件中读取下一个字符,其一般调用方式为:
fgetc(文件指针);
成功时返回读取的字符,失败或文件结束时返回 EOF
。
示例:
FILE *fp = fopen("file.txt", "r");
char ch = fgetc(fp); // 从文件中读取一个字符
fclose(fp);
fputs()函数
将一个字符串写入到指定的文件,其一般调用方式为:
fputs("要写入的字符串",文件指针);
成功时返回非负值,失败时返回 EOF
。
示例:
FILE *fp = fopen("file.txt", "w");
fputs("Hello, World!", fp); // 将字符串写入文件
fclose(fp);
fgets()函数
从文件中读取一行,最多读取 n-1
个字符,自动添加终止符 '\0'
,其一般调用方式为:
fgets(用来存储读取内容的字符数组str,最大读取字符数n,文件指针);
成功时返回 str
,文件结束时返回 NULL
,读取出错时返回 NULL
。
示例:
FILE *fp = fopen("file.txt", "r");
char str[100];
fgets(str, 100, fp); // 从文件读取一行
fclose(fp);
fread()函数
从文件中读取 count
个元素,每个元素的大小为 size
字节,存入 ptr
指向的内存区域。其一般调用方式为:
fread(存储数据的内存区域,每个元素的大小,要读取的元素数量,文件指针);
成功时返回实际读取的元素数量,如果读取出错或到达文件末尾,返回值小于 count
。
示例:
FILE *fp = fopen("file.bin", "rb");
int buffer[10];
fread(buffer, sizeof(int), 10, fp); // 从二进制文件读取 10 个整数
fclose(fp);
fwrite()函数
将 count
个元素(每个大小为 size
字节)从内存写入文件,其一般调用方式为:
fwrite(要写入数据的内存区域,每个元素的大小,要写入的元素数量,文件指针);
成功时返回实际写入的元素数量,失败时返回小于 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);
fprintf()函数
将格式化的数据写入到文件中,类似于 printf
,但是输出到文件,其一般调用形式为:
fprintf(文件指针,"要写入的内容");
成功时返回写入的字符数,失败时返回负值。
示例:
FILE *fp = fopen("file.txt", "w");
fprintf(fp, "Number: %d, Pi: %.2f\n", 42, 3.14159); // 格式化写入数据
fprintf(fp,"写入一个字符串");
fclose(fp);
fscanf()函数
从文件中按格式读取数据,类似于 scanf
,但输入来源是文件,其一般调用形式为:
fscanf(文件指针,"格式化字符串",...);
成功时返回成功读取的项目数,失败时返回 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
这是一串字符串
文件的定位
fseek()函数
设置文件指针的具体位置,其一般调用方式如下:
fseek(文件指针,偏移量,起始位置);
SEEK_SET
:从文件的开头开始定位。SEEK_CUR
:从当前文件指针的位置开始定位。SEEK_END
:从文件的末尾开始定位。
成功时,返回0
。 失败时,返回-1
。
示例:
#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;
}
rewind()函数
将文件指针重置到文件的开头,其一般调用形式为:
rewind(文件指针);
没有返回值
示例:
#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;
}