随机读写文件
2021-10-31 本文已影响0人
lxr_
#include <stdio.h>
#include <stdlib.h>
struct Student //定义Student结构体
{
char name[24];
int id;
}stu[3],sb; //定义结构体数组stu和结构体变量sb
int main(int argc, char** argv)
{
FILE* fp;
if ((fp = fopen("hello.txt", "w")) == NULL)//打开文件时,文件指示器在文件开始:即0位置处
{
printf("文件打开失败\n");
exit(EXIT_FAILURE);
}
printf("%ld\n", ftell(fp)); //0 使用ftell函数获取当前文件指示器的位置,返回类型为long
fputc('h', fp); //向文件写入一个字符
printf("%ld\n", ftell(fp)); //1
fputs("ello\n", fp); //向文件写入一个字符串
printf("%ld\n", ftell(fp)); //7 因为写入了hello\n,而Windows的换行会被自动转换为\r\n,所以文件中一共为7个字节,在linux下运行结果为6
rewind(fp); //文件指示器移至文件开始处,即0位置处
fputs("world", fp); //文件内容变为world,将原来的内容覆盖,相当于从头开始重新写入如果写入字符个数的少于原来文件中的,则多于的部分仍然存在
fclose(fp); //关闭文件
//int fseek(FILE* stream,long int offset,int whence);用于设置文件流的位置指示器
//offset指定从whence参数的位置起偏移多少个字节,whence指定开始偏移的位置,可以为SEEK_SET(文件头),SEEK_CUR(当前读写位置),SEEK_END(文件末尾)
//指定为SEEK_END时,offset通常为负值,如offset为-1时,表示文件最后一个位置
//函数调用成功返回0,否则返回非0值
//*********实验:向文件写入多个student信息,并查询某个学生信息********
//**********写入信息************
if ((fp = fopen("student.txt", "w")) == NULL) //也可使用wb模式打开文件
{
printf("打开文件失败\n");
exit(EXIT_FAILURE);
}
printf("请开始录入学生信息(格式:姓名 学号 )\n");
for (int i = 0; i < 3; i++)
{
scanf("%s %d", stu[i].name, &stu[i].id); //按照格式录入信息
}
fwrite(stu, sizeof(struct Student), 3, fp); //以二进制格式写入信息
fclose(fp);
//**********读取**********
if ((fp = fopen("student.txt", "r")) == NULL) //也可使用rb模式打开文件
{
printf("打开文件失败\n");
exit(EXIT_FAILURE);
}
fseek(fp, sizeof(struct Student), SEEK_SET); //文件指示器从文件头开始偏移sizeof(struct Student)个字节,相当于文件指示器移动到第一个学生信息后面
fread(&sb, sizeof(struct Student), 1, fp); //此时的读取一个sizeof(struct Student)大小,则读取的为第二个学生的信息存入sb中
printf("%s-%d\n", sb.name, sb.id); //打印读取的第二个学生的信息
system("pause");
return 0;
}
//******** 注意:可移植性问题 ************
//换行符不一样的问题,linux下为"\n",windows下为"\r\n"
//对于以二进制模式打开的文件,fseek函数在某些操作系统可能不支持SEEK_END位置
//对于以文本模式打开的文件,fseek函数的whence参数只能取SEEK_SET才是有意义的,并且传递给offset参数的值要么是0,要么是上一次对同一个文件调用ftell函数获得的返回值