2 gzdrn gzdrn 于 2016.04.27 00:44 提问

为什么我的结构体在文件中读出打印出现乱码?
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,'\0',sizeof(n_act.content));
    memset(n_act.creator,'\0',sizeof(n_act.creator));
    memset(n_act.request,'\0',sizeof(n_act.request));
    memset(n_act.participants,'\0',sizeof(n_act.participants));
    //n_act.next=NULL;
    memset(n_act.time,'\0',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,'\0',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("活动编号为:%d\n",t.num);
    printf("活动消息:\n");
    printf("%s\n",t.content);
    printf("活动时间(yyyymmdd为格式):\n");
    printf("%s\n",t.time);

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


    return 0;
}   

3个回答

caozhy
caozhy   Ds   Rxr 2016.04.27 00:51

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

gzdrn
gzdrn 嗯嗯,不过奇怪的是我用程序读二进制文件,打印变量居然还是乱码。。。
大约 2 年之前 回复
wangxin_el
wangxin_el   2016.04.27 12:18

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

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

wangxin_el
wangxin_el   2016.04.27 12:20

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

这样应该就好了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题
首先,结构体里面的字符串指针输出出现乱码的问题: 相信很多遇到过这种问题的人都跟我一样写过这样的代码(好吧,或许不一样。。。): #include #include typedef struct{ int age; const char* name; const char* id; }person; person p(); int main(){ person s[1]; s[0]=
C语言文件写入结构体的乱码解决方法
C语言中用 fwrite 向文件写入结构体时出现乱码的解决方法,由于fwrite是用于二进制文件的,所以打开直接写入的文件是会出现乱码,这时需要一个中间文件来存储临时数据,就是先将数据存储在一个临时文件,然后从这个数据中读取出来在写入目标文件。也许我描述的不是很好,下面看看我写的一个例子或许你就会明白我说的是什么了。 #include int main () {   FILE
Java程序运行结果输出到一个文件中去,结果显示乱码
        最近写了一个素数发生器,可以生成相当大范围内的素数,由于素数很多,所以为了方便别的算法调用,我决定把生成的素数保存到一个文件当中去,按照通常的写法,我以生成100000以内的所有素数为例,写了如下语句:        d:/> java MakePrime >primebank..txt       primebank.txt文件顺利生成,但打开一看全是乱码,而我在命令
读取磁盘文件的时候为什么老是出现乱码?
#include #include using namespace std; //定义类 class student { public: char num[16]; char name[12]; float math; float english; float computer; // floa
Java写入字符串再进行读取出现乱码
今天在研究怎么将实体类转为document,花了一个下午,整体思路是先将实体类利用反射转化为xml字符串,再将字符串转化为InputStream流,再调用SAXDreader的read(InputStream in)方法获取document对象。     但是在实现过程中碰到了一个问题。     因为需要将xml字符串转化为InputStream流,我就先将xml字符串保存到一个文件中,再进行
fprintf、fscanf读写乱码的问题
前几天写类linux文件系统的时候,被这个搞死了,今天终于弄懂了   这是cpp文件   #include   #include   #include   #include   using namespace std;   char ch[250];   struct s{   short a, b;   };   int main(){   FILE *file = fo
AS的中文乱码出现情况及解决方式
乱码分为两类: 1、IDE窗口中文乱码: 成因: Setting/Appearance &Behavior默认的窗口字体不兼容中文字体 解决方式: Setting/Appearance &Behavior默认的窗口字体 注意事项; 微软雅黑可能是英文也可能是中文:   2、代码中出现中文乱码: 成因:字符编码使用GBK,而GBK是一次两个字节两个字节读取,而默认的代
DNW字符乱码的原因及解决办法w哦
dnw乱码解决方案,很简单
eclipse中文乱码修改新方法,在修改了所有的utf-8都没有用就这样修改
方法背景:想看别人的JAVA项目,导入eclipse后出现中文乱码,在设置了所有的工作空间都为UTF-8以后都没有用,并且项目Resource选项没有GBK选项,或统一选择GBK后会使其他项目出现中文乱码,可以用此方法。 方法原理:逐个修改导入项目的编码文件:org.eclipse.core.resources.prefs 文件
串口乱码及其分析处理
最近在做有关串口通信的工作,对串口乱码,以及波特率的设置是深有体会,我觉 得可以总结为如下几点; 1,当我们发现串口问题时,我们首先想到的是乱码的事情跟波特率的关系是挺大的,所以我们发现串口的乱码问题时,首先想到的是应该跟波特率有关系,波特率不匹配早成了这种问题。 2,当波特率不匹配的时候,我们还会发现乱码,其实追根到底还是波特率惹的祸,比如说晶振的不匹配,Fpclk设置的不合