您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
063第十一章 文件操作04(新版)
发布时间:2021-05-09 11:24:24编辑:雪饮阅读()
写一个load()函数将上篇产生的student-list文件内容读取并显示出来! 聪明如你,认真思考一定能做到的!
实现细节如:
#include <stdio.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
void load()
{
FILE *fp;
int i;
if( !(fp = fopen("student-list", "r")))
{
printf("Cannot open the file!\n");
return;
}
for( i=0; i < SIZE; i++ )
{
/*
fread:
从给定输入流stream读取最多count个对象到数组buffer中(相当于对每个对象调用size次fgetc),把buffer当作unsigned char数组并顺序保存结果。
流的文件位置指示器前进读取的字节数。
若出现错误,则流的文件位置指示器的位置不确定。若没有完整地读入最后一个元素,则其值不确定。
参数:
buffer 指向要读取的数组中首个对象的指针
size 每个对象的大小(单位是字节)
count 要读取的对象个数
stream 输入流
*/
fread(&stu[i], sizeof(struct student), 1, fp);
}
fclose(fp);
}
void main()
{
int i;
//通过load函数读取到stu数组
load();
printf(" name num age address\n");
//遍历输出stu数组
for( i=0; i < SIZE; i++ )
{
/*
%10s:
至少输出10个字符的字符串输出,不够10个字符空格补全,超过10字符原样输出
*/
printf("%10s %5d %5d %10s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);
}
}
对于库文件student-list的生成文件昨天这个生成是错的,但是其源代码是没有问题的,只是编译运行时输入有误(打脸)
这里需要先把这个库文件重新生成下:
D:\cproject>gcc p.c -o p
D:\cproject>p.exe
Please input the student's name, num, age and address:
xy 1 23 dizhi1
dmj 2 24 dizhi2
cxg 3 25 dizhi3
gjp 4 24 dizhi 4
然后再次编译运行上面实现的这个实例即可:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
name num age address
xy 1 23 dizhi1
dmj 2 24 dizhi2
cxg 3 25 dizhi3
gjp 4 24 dizhi
C语言文件的随机读写
实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。
文件定位函数rewind和fseek
文件定位函数rewind和fseek
个人理解:这里随机读写,是相对来说的,并不是字面意思,读取就是随机的。
而如果不从文件定位,而是采用默认的读写,则就是顺序读写。
所以c语言文件的随机读写实例如:
#include <stdio.h>
#include <stdlib.h>
struct student
{
char name[10];
int num;
int age;
char addr[15];
}boy;
void main()
{
FILE *fp;
int i=1; // 用于定位第 i 个结构
if( !(fp = fopen("student-list", "r")))
{
printf("Cannot open the file!\n");
return;
}
/*
这里甲鱼把这个函数一开始就执行,我觉得不妥,因为该文件在本程序生命周期内第一次打开,那么文件内部指针默认就是归0的。
除非某些特殊情况,但是即便是特殊情况也要针对不同的情况来判断是否需要归0,直接的强制归0,除非该文件只给本程序使用,不影响到其它事情的情况下。
*/
//rewind(fp);
/*
fseek:
int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。
如果执行失败(比如offset取值大于等于2*1024*1024*1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值。
*/
fseek(fp, i*sizeof(struct student), 0);
//结合上面的fseek及其参数,则这里的意思就是从1的下标(即从第二个信息)开始读取,并且只读取一个student信息
fread(&boy, sizeof(struct student), 1, fp);
printf("name\tnumber age addr\n");
printf("%s\t%5d %7d %s\n", boy.name, boy.num, boy.age, boy.addr);
system("pause");
}
这里还是使用上面最后一次生成的student-list文件进行读取。
那么编译及运行结果如:
关键字词:c语言,随机读写