C语言文件读写结构体类型数据

//读写结构体
#include <stdio.h>
typedef struct student
{
    int num;
    char name[30];
    char sex;
    float math;
    float english;
    float chinese;

}Stu;

Stu s[5] =
{
    1001,"wukong",'x',99,99,99,
    1002,"songjiang",'x',99,22,11,
    1003,"baoyu",'x',79,33,100,
    1004,"liudehua",'y',100,100,88,
    1005,"zhaosi",'z',33,34,12
};

int main(void)
{

    //往文件中写入结构体
    FILE* pf = fopen("G:/qtcode/stu.data","w+");
    if(pf == NULL)
        exit(-1);

    //写入方式1
    int i;
    for(i = 0;i<sizeof(s)/sizeof(*s);i++)
    {
        fwrite((void*)(&s[i]),sizeof(Stu),1,pf);
    }

    //写入方式2
    fwrite((void*)s,sizeof(s),1,pf);


    //写入方式3
    fwrite((void*)s,sizeof(Stu),5,pf);





    rewind(pf);
    //从文件中读结构体

    //读出方式1
    Stu buf;
    while( fread((void*)&buf,sizeof(Stu),1,pf) )
    {
        printf("num = %d\n",buf.num);
        printf("name = %s\n",buf.name);
        printf("sex = %c\n",buf.sex);
        printf("math = %.2f\n",buf.math);
        printf("english = %.2f\n",buf.english);
        printf("chinese = %.2f\n",buf.chinese);
        printf("--------------\n");
    }


    //读出方式2
    Stu buf[3];
    int j,n;
    while((n = fread((void*)buf,sizeof(Stu),3,pf)) > 0)
    {
        for(j = 0;j < n;j++)
        {
            printf("num = %d\n",buf[j].num);
            printf("name = %s\n",buf[j].name);
            printf("sex = %c\n",buf[j].sex);
            printf("math = %.2f\n",buf[j].math);
            printf("english = %.2f\n",buf[j].english);
            printf("chinese = %.2f\n",buf[j].chinese);
            printf("--------------\n");
        }
    }


    //读出方式3
    Stu buf[5];
    int j;
    fread((void*)buf,sizeof(Stu),5,pf);
    for(j = 0;j < 5;j++)
    {
        printf("num = %d\n",buf[j].num);
        printf("name = %s\n",buf[j].name);
        printf("sex = %c\n",buf[j].sex);
        printf("math = %.2f\n",buf[j].math);
        printf("english = %.2f\n",buf[j].english);
        printf("chinese = %.2f\n",buf[j].chinese);
        printf("--------------\n");
    }
    return 0;
}

以上是代码。

fwrite有一点是非str类型,虽然读出没有问题但是用记事本打开文件后非str型数据会乱码,怎么解决?

要解决这个问题,可以将非str类型的数据事先转换为str类型,然后再进行写入。以下是一个示例代码:

data = 12345  # 非str类型数据
data_str = str(data)  # 将数据转换为str类型

with open('file.txt', 'w') as f:
    f.write(data_str)

这样,在用记事本打开文件时,非str类型数据不会出现乱码,而是以字符串的形式呈现出来。

此时如何以int读出呢?

可以通过将str转换为int型读出

// 从文件中读取字符串
    fgets(str, 100, fp);

    // 将字符串转换为整数
    num = atoi(str);

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char str[100];
    int num;

    // 打开文件
    fp = fopen("data.txt", "r");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件。\n");
        return 1;
    }

    // 从文件中读取字符串
    fgets(str, 100, fp);

    // 将字符串转换为整数
    num = atoi(str);

    // 输出整数
    printf("读取的整数为:%d\n", num);

    // 关闭文件
    fclose(fp);

    return 0;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小宇宙中微子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值