tianyang648 2022-03-08 20:42 采纳率: 100%
浏览 257
已结题

c语言的问题,写入文件的内容变成乱码了,输出的也是乱码

问题遇到的现象和发生背景

正在学c语言,改了一下网课的代码,发现输入的和输出的全是乱码

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#pragma warning(disable : 4996)

struct Student
{
char name[20];
int num;
int age;
float score;
};

int main(void)
{
struct Student boys[3];
struct Student boy;
struct Student* pBoys;
FILE* fp;

pBoys = boys;
fp = fopen("text.txt", "wb+");
if (fp == NULL)
{
    printf("不能打开该文件。\n");
    getch();
    exit(0);
}
printf("请输入学生的相关数据:\n");

for (size_t i = 0; i < 3; i++)
{
    scanf("%s %d %d %f", pBoys->name, &pBoys->num, &pBoys->age, &pBoys->score);
    pBoys++;
}
fwrite(boys, sizeof(struct Student), 3, fp);
if (ferror(fp))
{
    puts("读取出错");
}
else
{
    puts("读取成功");
}
fseek(fp, sizeof(struct Student), SEEK_SET);

fread(boys, sizeof(struct Student),3, fp);
for (size_t i = 0; i < 3; i++)
{
    printf("%s %d %d %f\n", pBoys->name, &pBoys->num, &pBoys->age, &pBoys->score);
    pBoys++;
}

fclose(fp);


return 0;

}

运行结果及报错内容

请输入学生的相关数据:
a 10 10 10
b 10 10 10
c 10 10 10
读取成功
烫烫;8z< 15726888 15726892 0.000000
仞8?橓?15726920 15726924 0.000000
15726952 15726956 0.000000

G:\C++练习\结构体\文件\Debug\文件示例函数fseek.exe (进程 15520)已退出,代码为 0。
按任意键关闭此窗口. . .

我的解答思路和尝试过的方法

试过fprint和fscanf代码,也是了把fseek换成rewind(fp),都不行,诊断之后,发现fwrite之后,文档里全变成了乱码

我想要达到的结果

本来是想逐条输出结构体内容,但是怎么改都不行

  • 写回答

3条回答 默认 最新

  • 关注

    你的结构体对象有一个数组就行了,输出的时候不用加取地址符

    img

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #pragma warning(disable : 4996)
    
    struct Student
    {
    char name[20];
    int num;
    int age;
    float score;
    };
    
    int main(void)
    {
    struct Student boys[3];
    FILE* fp;
    fp = fopen("text.txt", "wb+");
    if (fp == NULL)
    {
        printf("不能打开该文件。\n");
        getch();
        exit(0);
    }
    printf("请输入学生的相关数据:\n");
    
    for (int i = 0; i < 3; i++)
    {
        scanf("%s %d %d %f", boys[i].name, &boys[i].num, &boys[i].age,& boys[i].score);
    }
    fwrite(boys, sizeof(struct Student), 3, fp);
    if (ferror(fp))
    {
        puts("读取出错");
    }
    else
    {
        puts("读取成功");
    }
    fseek(fp, sizeof(struct Student), SEEK_SET);
    
    fread(boys, sizeof(struct Student),3, fp);
    for (int i = 0; i < 3; i++)
    {
        printf("%s %d %d %f\n", boys[i].name, boys[i].num, boys[i].age, boys[i].score);
    
    }
    
    fclose(fp);
    
    
    return 0;}
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 关于模型训练的一个问题
  • ¥15 装了几千台服务器从来没遇到这种问题,哎看下哪位帮我解决吧
  • ¥15 单片机程序上的困难问题
  • ¥15 请教某软件缓存Ts文件破解合并mp4的方法
  • ¥15 求小游戏炸弹人中关于敌人的C++代码
  • ¥15 拿到这个服务器最高权限有偿
  • ¥50 来个抓app跳转支付宝转链接的
  • ¥15 remotes安装提示没有description文件
  • ¥15 AttributeError: 'NoneType' object has no attribute 'drop_duplicates'报错
  • ¥15 以下代码,运行结果报错