为什么我的结构体在文件中读出打印出现乱码?

问题描述

为什么我的结构体在文件中读出打印出现乱码?
struct activity
{
    int num;
    char content[1000];
    char time[10];
    char request[1000];
    char creator[50];
    char participants[1000][10];
    int parti_num;
    //struct activity *next;
};

 int create_activity(char creator[])//创建新的活动
{
    FILE *fp=fopen("new_activity.txt","a+");
    if(fp==NULL)
    {
        printf("创建失败n");
        exit(1);
    }
    printf("----------创建活动----------n");
    struct activity n_act;
    memset(n_act.content,'',sizeof(n_act.content));
    memset(n_act.creator,'',sizeof(n_act.creator));
    memset(n_act.request,'',sizeof(n_act.request));
    memset(n_act.participants,'',sizeof(n_act.participants));
    //n_act.next=NULL;
    memset(n_act.time,'',sizeof(n_act.time));
    printf("请输入活动消息:");
    getchar();
    gets(n_act.content);
    strcpy(n_act.creator,creator);
    printf("请输入活动时间(yyyymmdd为格式):");
    scanf("%s",n_act.time);
    printf("请输入活动人数:");
    scanf("%d",&n_act.parti_num);
    printf("请输入活动要求(以回车或空格结束):");
    getchar();
    //gets(n_act.request);
    scanf("%s",n_act.request);
    memset(n_act.participants,'',sizeof(n_act.participants));
    fwrite(&n_act,sizeof(struct activity),1,fp);
    printf("创建完成n");
    user_menu(creator);
    //fflush(fp);
    fclose(fp);
    return 0;
}

int view_new_activity(char user_name[])
{
    FILE *fp=fopen("new_activity.txt","rb");
    struct activity a[1010],temp;
    int i=0,len=0,j;
    //while(!feof(fp))
    //{
        //len++;
        fread(a,sizeof(struct activity),2,fp);
        //if(i>=1000)
            //break;
    //}
    //int len=i;
    fclose(fp);
    for(i=0;i<len-1;i++)
    {
        for(j=i+1;j<len;j++)
        {
            if(strcmp(a[i].time,a[j].time)>0)
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
    for(i=0;i<len;i++)
    {
        a[i].num=i;
    }
    printf("----------正在征集的活动----------n");
    for(i=0;i<2;i++)
        print_act(a[i]);

    user_menu(user_name);
    return 0;
}

int print_act(struct activity t)
{
    printf("活动编号为:%dn",t.num);
    printf("活动消息:n");
    printf("%sn",t.content);
    printf("活动时间(yyyymmdd为格式):n");
    printf("%sn",t.time);

    printf("活动人数:n");
    printf("%dn",t.parti_num);
    printf("活动要求:n");
    printf("%sn",t.request);
    printf("---------------------------n");

    return 0;
}

解决方案

因为你的文件不是文本文件,而是二进制文件,所以用记事本打开有乱码很正常。

解决方案二:

printf("请输入活动消息:");
getchar();
gets(n_act.content);

问题出在 getchar() 上, 汉字 一般用两个字节表示, 第一个字节被getchar()吃掉了, 剩下的一个字节跟下一个字的第一字节组成一个汉字, 后面都错开一个字节, 就形成了乱码。

解决方案三:

只接去掉 getchar();
printf("请输入活动消息:");
gets(n_act.content);

这样应该就好了

时间: 2024-09-20 00:16:23

为什么我的结构体在文件中读出打印出现乱码?的相关文章

c-将含有指针的结构体写入文件,关闭程序后如何再次读写

问题描述 将含有指针的结构体写入文件,关闭程序后如何再次读写 从文件中读出一篇英文文章,若干行,每行最多不超过80个字符.首次运行都不会出现错误,关闭后再次读写文件就会出现错误 #include #include #include #include #include #define N 100 typedef struct lnode { char data; struct lnode *next; }Linklist; Linklist *Par[N]; struct paragraph {

struct-新手求教,结构体在文件之间调用的问题

问题描述 新手求教,结构体在文件之间调用的问题 //main.c #include #include #include"Dfile.h" void main() { int i; biaozhun_in.shui=0; biaozhun_in.dian=0; puts("水电标准:"); scanf("%lf %lf",&biaozhun_in.shui,&biaozhun_in.dian); puts("水电耗:&qu

编译出错-用push_back函数将数存入结构体指针向量中编译不出错,运行的时候出不来!

问题描述 用push_back函数将数存入结构体指针向量中编译不出错,运行的时候出不来! #include #include #include using namespace std; typedef struct person { string name; vector length; }person,*person_List; int main() { int number; person_List p; person p1; p = (person_List)malloc(sizeof(p

(C语言完结)结构体在汇编中的表现形式

一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 2.在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类. 结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问.[1] 高级代

java-写了一个简单的MP3,用一个线程完成从文件中读出歌词,无法显示是怎么回事?

问题描述 写了一个简单的MP3,用一个线程完成从文件中读出歌词,无法显示是怎么回事? RT,原来用一个函数完成歌词的读取,可以显示,现在我用一个线程来完成同样的功能,代码都是完全从那个函数中复制过去的,结果无法显示,控制台中也无法输出,求解 以下是代码: package app; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent;

C#中怎么读取Struct(结构体)文件!!!!???大虾帮帮我啊。。。。。

问题描述 做项目需要读取一个.DAT文件,这个文件是别人给的,里面记录了一些调试需要用到的参数,是用结构体(Struct)写成的,用的是C++写的.....现在我拿到了这个.dat文件的结构,里面大致形式为(嵌套的结构体):structA{...structB{....structC{.....}}}好像用C++读取很容易,但我目前的软件都是用C#写的,只能在C#里面读了,这个要怎么读啊?网上找了一些资料,看上去好复杂,哪位大虾能详细的讲一下啊,谢谢!!!!还有,我曾经想过是否可以用C++写一个

Linux C Socket编程发送结构体、文件详解及实例

利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.cnblogs.com/xudong-bupt/p/3496741.html 1.memcpy Copy block of memory.内存块拷贝函数,该函数是标准库函数,可以进行二进制拷贝数据. 函数原型: void * memcpy ( void * destination, const voi

结构体存入文件并且取出

首先定义结构体 struct student_type { char name[10]; int num; int age; } stud; 将结构体写入 代码 void save() { FILE *fp; int i; if((fp=fopen("stu_list","a+"))==NULL) { printf("canot open the file."); exit(0); } if(fwrite(&stud,sizeof(str

结构体数组-C++中一个很奇怪的数组

问题描述 C++中一个很奇怪的数组 static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = { { ins_update, 1, 1000 }, { one_hz_print, 50, 1000 }, { five_second_call, 250, 1800 }, }; 注:AP_Scheduler是一个类,Task是这个类的结构体成员,一下是Task的定义: struct Task { task_fn_t function; u