文件操作 | 无关风月,我题序等你回~
Cobb 648 0

环境vs2019,起步报错: C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

莫担心: 项目右键 - 属性 - C/C++ - 常规 - SDL检查(选择:否)

可参考文章:文件操作,有函数的详细说明

示例一:

fprintf 往文件中写格式化数据 fscanf 格式化读取文件中数据 fputs / fgets:一次操作一行。 fgets 遇到空格不结束 fputc / fgetc:一次读取写入文件一个字符

int main()
{
    // "w":写方式打开,删除旧文件,重新创建新文件写入
    // "a":以追加的方式打开
    FILE* pf = fopen("data.txt", "w");
    if (pf == NULL)
    {
        printf("data.txt open err.");
        exit(-1);
    }
    printf("data.txt open success.");
    fprintf(pf, "%s %s %s %d", "无关风月", "我", "题序等你回~", 2021);
    /*
    *小知识:
        int fprintf(FILE *stream, const char *format, ...)
        格式化输出到流 stream 中。
        stream后面的格式化输入到stream指向的文件中
    */
    fclose(pf);

    // "r":读方式打开,如果文件不存在,打开失败
    FILE* rpf = fopen("data.txt", "r");
    if (rpf == NULL)
    {
        printf("data.txt open err.");
        exit(-1);
    }

    char buffer[1024] = { 0 };
    fgets(buffer, 1024, rpf);
    printf("read from data.txt : %s\n", buffer);
    fclose(rpf);
}

示例二:

ftell:返回文件位置指针 离文件开头的距离 二进制文件(存储的是内存上的原始数据,没有经过字符编码的):fwrite / fread fseek:移动文件位置指针 SEEK_SET SEEK_CUR SEEK_END

struct Student
{
    int id;
    char name[50];
    int age;
    char sex[20];
};

void CheckErr(FILE* pf, const char* file, int line)
{
    if (pf == NULL)
    {
        printf("err. %s:%d\n", file, line);
        exit(-1);
    }
}

// 读出学生的个人信息,并打印
int main()
{
    Student stus[] = {
        {1000, "zhangsan", 20, "male"},
        {1010, "lisi", 22, "female"},
        {1020, "xiaoming", 25, "male"},
        {1030, "lihua", 35, "female"},
        {1040, "hedong", 21, "male"}
    };

    //01、 先把数据写入到文件中,再从文件中进行读取
    FILE* pf1 = fopen("stu.txt", "w");
    CheckErr(pf1, __FILE__, __LINE__);
    fwrite(stus, sizeof(Student), 5, pf1);  // 把数组中的信息写入到文件
    fclose(pf1);

    //02、 从文件中读取学生的数据,
    FILE* pf2 = fopen("stu.txt", "r+");
    CheckErr(pf2, __FILE__, __LINE__);
    // 把文件位置指针从开头移动到末尾
    fseek(pf2, 0, SEEK_END);
    // 获取文件的大小  返回文件位置指针离文件开头的距离
    long fileSize = ftell(pf2);
    // 把文件位置指针移动到文件的开头
    fseek(pf2, 0, SEEK_SET);


    //03、 得到学生的个数num = 文件大小 / sizeof(Student)
    int num = fileSize / sizeof(Student);

    //04、 定义num个学生的数组
    Student* stuss = (Student*)malloc(sizeof(Student) * num);
    if (stuss == NULL)
    {
        exit(-1);
    }

    //05、 将每个学生信息读到数组中
    fread(stuss, num, sizeof(Student), pf2);
    fclose(pf2);

    //06、 进行打印
    for (int i = 0; i < num; i++)
    {
        printf("id:%d name:%s age:%d sex:%s\n",
            stuss[i].id, stuss[i].name, stuss[i].age, stuss[i].sex);
    }
    free(stuss);
}
评论区

索引目录