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

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 slam rangenet++配置
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊