随机读写文件

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函数获得的返回值

上一篇 下一篇

猜你喜欢

热点阅读