网站简繁体转换 js,企业大型网站开发网站模板设计,包头建设厅官方网站,35个成功的市场营销策划案例C 语言文件读写
在本教程中#xff0c;您将学习如何在C语言中处理文件。您将通过示例学习在C语言中使用fprintf()、fscanf()、fread()、fwrite()、fseek()等处理标准I/O。
文件是计算机存储设备中用于存储数据的容器。
为什么需要文件#xff1f;
当程序终止时#xff0…C 语言文件读写
在本教程中您将学习如何在C语言中处理文件。您将通过示例学习在C语言中使用fprintf()、fscanf()、fread()、fwrite()、fseek()等处理标准I/O。
文件是计算机存储设备中用于存储数据的容器。
为什么需要文件
当程序终止时所有数据都会丢失。即使程序终止存储在文件中也会保留您的数据。如果必须输入大量数据则将花费大量时间来全部输入。 但是如果您有一个包含所有数据的文件则可以使用C中的一些命令方法轻松地访问文件的内容。您可以轻松地将数据从一台计算机移动到另一台计算机而无需进行任何更改。
文件类型
处理文件时您应该了解两种类型的文件
文本文件二进制文件
1.文本文件
文本文件是普通的**.txt**文件。您可以使用任何简单的文本编辑器例如记事本轻松创建文本文件。
打开这些文件时您将以纯文本形式看到文件中的所有内容。您可以轻松地编辑或删除内容。
它们以最少的维护工作易于阅读提供最少的安全性并占用更大的存储空间。
2.二进制文件
二进制文件主要是计算机中的**.bin**文件。
它们不是以纯文本格式存储数据而是以二进制格式0和1存储数据。
与文本文件相比它们可以容纳更多数据不易读取并提供更好的安全性。
文件操作
在C中您可以对文件执行四个主要操作
创建一个新文件打开现有文件关闭文件读取信息并将信息写入文件
处理文件
处理文件时需要声明文件类型的指针。文件和程序之间的通信需要此声明。
FILE *fptr;打开文件-用于创建和编辑
使用stdio.h头文件中定义的fopen()函数打开文件。
在标准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()的文件版本。 唯一的区别是fprint()和fscanf()需要指向结构FILE的指针。
示例1写入文本文件
#include stdio.h
#include stdlib.hint main()
{int num;FILE *fptr;// 如果您使用的是MacOS或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.hint main()
{int num;FILE *fptr;if ((fptr fopen(C:\\program.txt,r)) NULL){printf(Error! opening file);//如果文件指针返回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.hstruct 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);// 如果文件指针返回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;
}在此程序中我们在C驱动器中创建一个新文件program.bin。
我们声明具有三个数字n1n2和n3的结构体threeNum并将其在主函数中定义为num。
现在在for循环中我们使用fwrite()将值存储到文件中。
第一个参数接受num的地址第二个参数接受结构threeNum的大小。
由于我们仅插入num的一个实例因此第三个参数为1。最后一个参数* fptr指向我们要存储数据的文件。
最后我们关闭文件。
从二进制文件读取
fread()函数也采用与上述fwrite()函数相似的4个参数。
fread(addressData, sizeData, numbersData, pointerToFile);示例4使用fread()从二进制文件读取
#include stdio.h
#include stdlib.hstruct 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);//如果文件指针返回NULL则程序退出。exit(1);}for(n 1; n 5; n){fread(num, sizeof(struct threeNum), 1, fptr); printf(n1: %d\tn2: %d\tn3: %d, num.n1, num.n2, num.n3);}fclose(fptr); return 0;
}在此程序中您读取相同的文件program.bin并逐个循环浏览记录。
简单来说您将从* fptr指向的文件中读取一个threeNum大小的threeNum*fptrnum记录到num结构中。
您将获得与示例3中插入的记录相同的记录。
使用fseek()获取数据
如果文件中有很多记录并且需要访问特定位置的记录则需要遍历所有记录才能获取该记录。
这将浪费大量的内存和操作时间。使用fseek()可以轻松获得所需数据。
顾名思义fseek()将光标定位到文件中的给定记录。
fseek()的语法
fseek(FILE * stream, long int offset, int whence);第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置第三个参数指定偏移量开始的位置。
位置含义SEEK_SET从文件开头开始偏移。SEEK_END从文件的末尾开始偏移。SEEK_CUR从文件中光标的当前位置开始偏移。
示例5fseek()
#include stdio.h
#include stdlib.hstruct 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);//如果文件指针返回NULL则程序退出。exit(1);}// 将光标移到文件末尾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);cfseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);}fclose(fptr); return 0;
}该程序将以相反的顺序从最后到第一开始从文件program.bin中读取记录并进行打印。