C 文件处理
C 文件处理
在本教程中,您将学习 C 中的文件处理。您将学习使用 fprintf()、fscanf()、fread()、fwrite()、fseek() 等在 C 中处理标准 I/O。例子。
文件是计算机存储设备中用于存储数据的容器。
为什么需要文件?
- 当程序终止时,整个数据都会丢失。即使程序终止,存储在文件中也会保留您的数据。
- 如果您必须输入大量数据,则将它们全部输入需要很长时间。
但是,如果您有一个包含所有数据的文件,您可以使用 C 语言中的一些命令轻松访问该文件的内容。 - 您可以轻松地将数据从一台计算机移动到另一台计算机,而无需进行任何更改。
文件类型
在处理文件时,有两种类型的文件你应该知道:
- 文本文件
- 二进制文件
1。文本文件
文本文件是普通的 .txt 文件。您可以使用任何简单的文本编辑器(例如记事本)轻松创建文本文件。
当您打开这些文件时,您会以纯文本形式看到文件中的所有内容。您可以轻松编辑或删除内容。
它们需要最少的维护工作,易于阅读,提供的安全性最低,占用的存储空间更大。
2。二进制文件
二进制文件大多是 .bin 计算机中的文件。
它们不是以纯文本形式存储数据,而是以二进制形式(0 和 1)存储数据。
它们可以容纳更多的数据,不易读取,并且比文本文件提供更好的安全性。
文件操作
在 C 语言中,您可以对文件执行四种主要操作,无论是文本还是二进制文件:
- 创建一个新文件
- 打开现有文件
- 关闭文件
- 从文件读取信息和将信息写入文件
处理文件
处理文件时,需要声明文件类型的指针。文件和程序之间的通信需要这个声明。
FILE *fptr;
打开文件 - 用于创建和编辑
使用 fopen()
打开文件 stdio.h
中定义的函数 头文件。
在标准 I/O 中打开文件的语法是:
ptr = fopen("fileopen","mode");
例如,
fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
- 假设文件
newprogram.txt
位置E:\cprogram
中不存在 .第一个函数创建一个名为newprogram.txt
的新文件 并按照 'w' 模式打开它进行写入 .
写入模式允许您创建和编辑(覆盖)文件的内容。 - 现在让我们假设第二个二进制文件
oldprogram.bin
存在于位置E:\cprogram
.第二个函数打开现有文件以二进制模式读取 'rb' .
读取模式只能读取文件,不能写入文件。
模式 | 模式的含义 | 文件不存在期间 |
---|---|---|
r | 打开阅读。 | 如果文件不存在,fopen() 返回 NULL。 |
rb | 以二进制方式打开读取。 | 如果文件不存在,fopen() 返回 NULL。 |
w | 开放写作。 | 如果文件存在,则覆盖其内容。 如果文件不存在,则会创建它。 |
wb | 以二进制模式打开写入。 | 如果文件存在,则覆盖其内容。 如果文件不存在,则会创建它。 |
a | 打开以追加。 数据被添加到文件的末尾。 | 如果文件不存在,则创建该文件。 |
ab | 以二进制模式打开以追加。 数据被添加到文件的末尾。 | 如果文件不存在,则创建该文件。 |
r+ | 可读写。 | 如果文件不存在,fopen() 返回 NULL。 |
rb+ | 以二进制方式打开读写。 | 如果文件不存在,fopen() 返回 NULL。 |
w+ | 可读写。 | 如果文件存在,则覆盖其内容。 如果文件不存在,则会创建它。 |
wb+ | 以二进制方式打开读写。 | 如果文件存在,则覆盖其内容。 如果文件不存在,则会创建它。 |
a+ | 打开以供阅读和附加。 | 如果文件不存在,则创建该文件。 |
ab+ | 以二进制模式打开以供读取和附加。 | 如果文件不存在,则创建该文件。 |
关闭文件
文件(文本和二进制文件)应该在读/写后关闭。
使用 fclose()
执行关闭文件 功能。
fclose(fptr);
这里,fptr
是与要关闭的文件关联的文件指针。
读取和写入文本文件
为了读取和写入文本文件,我们使用函数 fprintf()
和 fscanf().
它们只是 printf()
的文件版本 和 scanf()
.唯一的区别是 fprintf()
和 fscanf()
需要一个指向结构 FILE 的指针。
示例1:写入文本文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
// use appropriate location if you are using MacOS or Linux
fptr = fopen("C:\\program.txt","w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
printf("Enter num: ");
scanf("%d",&num);
fprintf(fptr,"%d",num);
fclose(fptr);
return 0;
}
该程序从用户那里获取一个数字并存储在文件 program.txt
中 .
编译运行这个程序后,可以看到一个文本文件program.txt
在您的计算机的 C 驱动器中创建。打开文件可以看到输入的整数。
示例2:从文本文件中读取
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
if ((fptr = fopen("C:\\program.txt","r")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
fscanf(fptr,"%d", &num);
printf("Value of n=%d", num);
fclose(fptr);
return 0;
}
该程序读取存在于 program.txt
中的整数 文件并将其打印到屏幕上。
如果您从 示例 1 成功创建了文件 , 运行这个程序会得到你输入的整数。
fgetchar()
等其他函数 , fputc()
等可以类似的方式使用。
二进制文件的读写
函数 fread()
和 fwrite()
对于二进制文件,分别用于读取和写入磁盘上的文件。
写入二进制文件
要写入二进制文件,您需要使用 fwrite()
功能。这些函数有四个参数:
- 要写入磁盘的数据地址
- 要写入磁盘的数据大小
- 此类数据的数量
- 指向要写入的文件的指针。
fwrite(addressData, sizeData, numbersData, pointerToFile);
示例 3:使用 fwrite() 写入二进制文件
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
for(n = 1; n < 5; ++n)
{
num.n1 = n;
num.n2 = 5*n;
num.n3 = 5*n + 1;
fwrite(&num, sizeof(struct threeNum), 1, fptr);
}
fclose(fptr);
return 0;
}
在这个程序中,我们新建一个文件program.bin
在C盘。
我们声明一个结构 threeNum
三个数字 - n1、n2 和 n3 ,并在main函数中定义为num。
现在,在 for 循环中,我们使用 fwrite()
将值存储到文件中 .
第一个参数取num的地址 第二个参数取结构 threeNum
的大小 .
因为我们只插入 num 的一个实例 ,第三个参数是1
.并且,最后一个参数 *fptr
指向我们存储数据的文件。
最后,我们关闭文件。
从二进制文件中读取
函数 fread()
也接受 4 个类似于 fwrite()
的参数 功能同上。
fread(addressData, sizeData, numbersData, pointerToFile);
示例 4:使用 fread() 从二进制文件中读取
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
在这个程序中,您读取了相同的文件 program.bin
并一一循环遍历记录。
简单来说,你读了一个threeNum
threeNum
的记录 *fptr 指向的文件的大小 进入结构 num .
您将获得在 示例 3 中插入的相同记录 .
使用 fseek() 获取数据
如果一个文件中有很多条记录,需要访问特定位置的一条记录,则需要遍历它之前的所有记录来获取该记录。
这会浪费大量的内存和操作时间。使用 fseek()
可以更轻松地获取所需数据 .
顾名思义,fseek()
将光标定位到文件中的给定记录。
fseek() 的语法
fseek(FILE * stream, long int offset, int whence);
第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置,第三个参数指定偏移开始的位置。
从何而来 | 意义 |
---|---|
SEEK_SET | 从文件开头开始偏移。 |
SEEK_END | 从文件末尾开始偏移。 |
SEEK_CUR | 从文件中光标的当前位置开始偏移。 |
示例 5:fseek()
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
// Moves the cursor to the end of the file
fseek(fptr, -sizeof(struct threeNum), SEEK_END);
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
}
fclose(fptr);
return 0;
}
该程序将开始从文件 program.bin
中读取记录 以相反的顺序(从后到前)并打印出来。
C语言