二进制形式读取:
fread和fwrite是以二进制的形式进行读取一组数据的
fread:
fread(数组地址,size,count,fp);
直接举一个例子说明:
fread(arr,4,10,fp):
表示从fp这个文件指针指向的文件中读取10个每一个大小为4个字节的数据项存放到arr这个数组中去。
fwrite:
fwrite(数组地址,size,count,fp)
二者的联系:
我总结一段话来概况一下:
我们通常对一组数据进行scanf输入之后,输入到我们的程序数据区(显示器)。
但是并没有存储到我们的磁盘文件中去。
这个时候我们就要通过fopen进行打开一个输出文件,用wb的形式进行打开
打开这个输出文件之后,
我们先用fwrite进行把scanf输入的数据进行输出,输出到磁盘文件中去。
对一个已经写好的磁盘文件中的数据进行读取出来的时候,我们要用到fread
fread通常用来检测fwrite是否已经完成了把scanf输入的数据输出到磁盘文件的这一步操作。
oK:接下来举例子说明:
与文件操作有关的代码如下:
void input(struct student stu[N])
{
int i;
for (i = 0; i < N; i++)
{
printf("请输入姓名");
gets(stu[i].name);
printf("请输入电话");
gets(stu[i].phone);
printf("请输入分数");
scanf("%f", &stu[i].score);
getchar();//吸收空格
}
//当我们把学生的数据输入到程序数据区之后,
//我们需要通过fwrite进行输出写入到磁盘文件中去
//因此调用save方法
save(stu);
}
void save(struct student stu[N])
{
//1.先声明一个文件指针
FILE* fp;
int i;
printf("==========================================");
//2.以wb形式(即是以二进制只写的形式)打开fp指向的文件
//w代表只写 b代表bit比特为二进制位
fp = fopen("d:\\student.dat", "wb");
//我们这里用到转义字符\\表示一个\
if (fp == NULL)
{
printf("Cannot open the file!\n");
exit(0);//表示退出
}
for (i = 0; i < N; i++)
{
fwrite(&stu[i], sizeof(struct student), 1, fp);
fclose(fp);
printf("The file has been saved successfully");
printf("==========================================");
}
}
//当储存到磁盘文件中之后,我们通过fread进行读取打印
void display(struct student stu[N])
{
int i;
FILE* fp;
printf("==========================================");
//注意这里打开文件的方式应该改正为 rb
//r代表read b同上解释
fp = fopen("d:\\student.dat", "rb");
if (fp == NULL)
{
//如果为空,那么证明磁盘文件中没有存储数据
printf("No data\n");
return;
}
for (i = 0; i < N; i++)
{
fread(&stu[i], sizeof(struct student), 1, fp);
printf("%-20s%-20s%-20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
}
printf("==========================================");
fclose(fp);
}
读写单个字符:
我们用fgetc和fputc:
例题1:
从键盘输入一些字符,并逐个把它们送到磁盘中,直到用户输入一个#为止
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE* fp;//定义一个文件指针
char ch;
char filename[10];//文件名
printf("请输入一个文件名:");
scanf("%s", &filename);
getchar();
//以只写的形式打开磁盘文件
fp = fopen(filename, "w");
//判断是否读取成功
if (fp == NULL)
{
printf("cannot open the file");
exit(0);
}
printf("请输入一个准备存储到磁盘的字符串(以#结束):");
ch = getchar();
while (ch != '#')
{
//把这个字符存储到fp指向的文件中去
fputc(ch, fp);
//在显示器上显示
putchar(ch);
//接收下一个单个字符
ch = getchar();
}
fclose(fp);//关闭文件
return 0;
}
例题2:
将一个磁盘文件中的信息复制到另外一个磁盘文件中。
要求比如(将file1.dat文件中的内容复制到另外一个磁盘文件file2.dat中)
解题思路:从file1.dat文件中逐个fgetc读入字符,然后逐个输出fputc到file2.dat中
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE* fp1, fp2;//定义两个文件指针
char ch, infile[10], outfile[10];
printf("请输入输入文件的文件名");
scanf("%s", &infile);
printf("请输入输出文件的文件名");
scanf("%s", &outfile);
//只读,把数据从磁盘文件中读取出来输入到程序数据区
fp1 = fopen(infile, "r");
//只写,把数据从程序数据区输出出来到磁盘文件中
fp2= fopen(outfile, "w");
if (fp1 == NULL)
{
printf("无法打开此文件");
exit(0);
}
if (fp2==NULL)
{
printf("无法打开此文件");
exit(0);
}
//1.从fp1磁盘文件中读取一个字符出来输入到程序数据区
ch = fgetc(fp1);
//当读取到fp1指向的末尾时,返回EOF结束标记符
while (!feof(fp1))
{
//2.把这个第一步读取的数据从程序数据区输出出来到fp2指向的磁盘文件中进行保存
fputc(ch, fp2);
putchar(ch);//将ch显示到屏幕上
ch = fgetc(fp1);//继续读取fp1指向的磁盘文件的下一个数据
}
fclose(fp1);
fclose(fp2);
return 0;
}
读写一个字符串:
我们用 fgets和fputs
例子1:
第一问:
从键盘读入若干个字符串,对它们按照字母大小的顺序进行排序,然后把排好序的字符串送到磁盘文件中保存。
第二问:
从这个磁盘文件中进行读取,判断是否把数据已经存到该磁盘文件中?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE* fp;
char str[3][10], temp[10];
int i, j, k, n = 3;
printf("请输入字符串");
for (i = 0; i < n; i++)
{
gets(str[i]);
}
//用选择法进行排序
for (i = 0; i < n; i++)
{
k = i;
for (j = 0; j < n - 1 - i; j++)
{
if (strcmp(str[j], str[k]) > 0)
{
k = j;
}
}
if (k != i)
{
strcpy(temp, str[k]);
strcpy(str[k], str[i]);
strcpy(str[i], temp);
}
}
FILE* fp;
fp = fopen("D:\\leomessi.dat", "w");
if (fp == NULL)
{
printf("打开文件失败");
exit(0);
}
for (i = 0; i < n; i++)
{
//向fp这个文件指针指向文件中输出一个str[i]字符串以及一个换行符
//
//这个代码的意思就是:
//把str[i]这个字符串输出到fp指向的磁盘文件中去
fputs(str[i], fp);
fputs("\n", fp);
printf("%s", str[i]);
}
//2.
//从D:\\leomessi.dat这个文件中读取,判断是否把数据已经存到该磁盘文件中?
FILE* fp2;
fp2 = fopen("D:\\leomessi.dat", "r");
if (fp == NULL)
{
printf("文件打开失败");
exit(0);
}
//每一次从fp指向的磁盘文件中读取一个长度为10-1的字符串到str[i]这个数组中去
//(为什么写成10?因为\0占用一个字符)
//如果读取成功,那么可以定义出来
while (fgets(str[i], 10, fp) != NULL)
{
printf("%s", str[i]);
i++;
}
fclose(fp);
return 0;
}
记录一个C程序开发题:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
struct student
{
char name[30];
char phone[30];
float score;
}stu[N];
int main()
{
int i;
//输入数据到程序数据区
void input(struct student stu[N]);
void sort(struct student stu[N]);//排序
void search(struct student stu[N], char text[30]);
//通过fwrite以二进制的形式进行储存input输入的数据到磁盘文件中
void save(struct student stu[N]);
//通过fread以二进制形式进行打印输出已经存到磁盘文件中的数据
void display(struct student stu[N]);
int menu();
while (i = menu())//如果输入0,循环之间退出
{
switch (i)
{
case 1:
input(stu);
break;
case 2:
display(stu);
break;
case 3:
sort(stu);
break;
case 4:
save(stu);
break;
}
system("pause");
}
return 0;
}
//展示菜单
int menu()
{
int i;
printf("========================================");
printf("1.输入志愿者信息\n");
printf("2.显示志愿者信息\n");
printf("3.按照专业绩点排序\n");
printf("4.信息存储到文件\n");
printf("0.退出\n");
printf("========================================");
printf("请输入您的选择:");
scanf_s("%d", &i);
getchar();//吸收空格
return i;
}
void input(struct student stu[N])
{
int i;
for (i = 0; i < N; i++)
{
printf("请输入姓名");
gets(stu[i].name);
printf("请输入电话");
gets(stu[i].phone);
printf("请输入分数");
scanf_s("%f", &stu[i].score);
getchar();//吸收空格
}
//当我们把学生的数据输入到程序数据区之后,
//我们需要通过fwrite进行输出写入到磁盘文件中去
//因此调用save方法
save(stu);
}
void save(struct student stu[N])
{
//1.先声明一个文件指针
FILE* fp;
int i;
printf("==========================================");
//2.以wb形式(即是以二进制只写的形式)打开fp指向的文件
//w代表只写 b代表bit比特为二进制位
fp = fopen("d:\\student.dat", "wb");
//我们这里用到转义字符\\表示一个\
if (fp == NULL)
{
printf("Cannot open the file!\n");
exit(0);//表示退出
}
for (i = 0; i < N; i++)
{
fwrite(&stu[i], sizeof(struct student), 1, fp);
fclose(fp);
printf("The file has been saved successfully");
printf("==========================================");
}
}
//当储存到磁盘文件中之后,我们通过fread进行读取打印
void display(struct student stu[N])
{
int i;
FILE* fp;
printf("==========================================");
//注意这里打开文件的方式应该改正为 rb
//r代表read b同上解释
fp = fopen("d:\\student.dat", "rb");
if (fp == NULL)
{
//如果为空,那么证明磁盘文件中没有存储数据
printf("No data\n");
return;
}
for (i = 0; i < N; i++)
{
fread(&stu[i], sizeof(struct student), 1, fp);
printf("%-20s%-20s%-20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
}
printf("==========================================");
fclose(fp);
}
void sort(struct student stu[N])
{
int i, j;
struct student temp;
for (i = 0; i < N; i++)
{
for (j = 0; j < N - 1 - i; j++)
{
if (stu[j].score < stu[j + 1].score)
{
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
}
void search(struct student stu[N], char text[30])
{
int i;
printf("=======================================");
for (i = 0; i < N; i++)
{
if (strcmp(stu[i].name, text) == 0)
{
//如果找到了,那么输出这个学生的信息
printf("%-20s%-20s%20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
return;
}
}
}