关于文件的问题,如何解决?

为什么out文件里面性别显示Ů啊
in文件里面是
2107403005 郑洋 男 90
2107403003 赵文清 女 88
2107403002 陈可可 女 95
2107403001 赵文清 男 90
-1

#include <stdio.h>
#include <string.h>
#include <malloc.h>
enum SEX {
 GIRL, BOY
};
struct SStudent {
 int num;     //学号 
 char name[20];    //姓名
 SEX sex;     //性别
 float score;    //成绩
 struct SStudent* next;  //下一个节点地址
};
struct SStudent *insert(struct SStudent *head,struct SStudent *p)
{
    struct SStudent *p1,*p2;
    if(head==NULL||p->num<head->num)
    {
        p->next=head;
        return p;
    }
    p1=p2=head;
    while(p->num>p2->num&&p2->next!=NULL)
    {
        p1=p2;
        p2=p2->next;
    }
    if(p->num<=p2->num)
    {
        p->next=p2;
        p1->next=p;
    }
    else
    {
        p2->next=p;
        p->next=NULL;
    }
    return head;
}
void write(struct SStudent *head)
{
    struct SStudent *p;
    FILE *fp;
    fp=fopen("out.txt","wt");
    p=head;
    while(p!=NULL)
    {
        fprintf(fp,"%d,%s,%s,%.2f\n",p->num,p->name,p->sex==BOY ?"男":"女",p->score);
        p=p->next;
    }
    fclose(fp);
}
int main()
{
    FILE *fp;
    char s[20];
    int t;
    struct SStudent *p,*head=NULL;
    fp=fopen("in.txt","rt");
    do
    {
        fscanf(fp,"%d",&t);
        if(t!=-1)
        {
            p=(struct SStudent *)malloc(sizeof(struct SStudent));
            p->num=t;
            fscanf(fp,"%s%s%f",p->name,s,&p->score);
            p->sex=(strcmp(s,"男")==0?BOY:GIRL);
            head=insert(head,p);
        }
    }
    while(t!=-1);
    fclose(fp);
    write(head);
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码和文件,问题可能出现在 write 函数中的 fprintf 语句。在该语句中,使用了 %s 格式符来输出 SStudent 结构体中的 sex 字段。由于 sex 字段是一个枚举类型,而不是字符串类型,因此在输出时可能会出现乱码。

解决这个问题的方法是,在 fprintf 语句中将 sex 字段先转换为字符串类型,然后再输出。例如,可以使用一个数组来保存性别字符串,然后根据 sex 字段的值来选择相应的字符串进行输出。修改后的 write 函数如下所示:

void write(struct SStudent *head)
{
    struct SStudent *p;
    FILE *fp;
    fp=fopen("out.txt","wt");
    p=head;
    while(p!=NULL)
    {
        const char *sex_str = (p->sex == BOY ? "男" : "女");
        fprintf(fp,"%d,%s,%s,%.2f\n",p->num,p->name,sex_str,p->score);
        p=p->next;
    }
    fclose(fp);
}

在这个版本的 write 函数中,我们首先定义了一个名为 sex_str 的字符串指针,用于保存性别字符串。然后根据 p->sex 字段的值来选择相应的字符串,并将其赋值给 sex_str。最后,在 fprintf 语句中使用 %s 格式符来输出 sex_str 字符串即可。

希望以上信息能够帮助您解决问题!


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

能截个图吗,因为这个在我这里运行正常:

img

  • 以下回答由chatgpt基于相关博客总结生成:

    通过查看问题描述,可以发现是out文件中的性别显示出现了乱码,而in文件中的性别显示是正确的。可能是因为out文件的编码方式与in文件不一致导致的。因此,我们需要检查out文件的编码方式,以及将其转换为与in文件相同的编码方式。下面是解决该问题的步骤:

    1. 确认out文件的编码方式:可以使用notepad++等文本编辑器打开out文件,选择“编码”菜单下的“检测文本编码”功能,查看当前文件使用的编码方式。

    2. 将out文件转换为与in文件相同的编码方式:可以使用notepad++等文本编辑器打开out文件,选择“编码”菜单下的“转换为UTf-8”(如果in文件是UTF-8) 或“转换为ANSI”(如果in文件是ANSI),将其转换为与in文件相同的编码方式。

    3. 保存转换后的out文件,并重新运行程序或查看文件,检查性别显示是否已经正确显示。

    如果以上步骤都未能解决问题,可能是因为out文件本身存在错误导致的乱码问题,需要进一步检查程序代码或输入数据的正确性。

    以上是一种可能的解决方案,具体解决方法还需要根据问题具体情况进行调整。