写入文件的数据为什么乱码?

biange2019 2014-11-06 12:00:00
从键盘输入两个学生的名字,和三门课的成绩,存入文件中再读出来,但是打开为什么是乱码?
#include<stdio.h>
#include<stdlib.h>
#define N 2
main()
{
FILE *fp;
int i,j;

struct student
{
char name[30];
float score[3];
};

struct student s1[N],s2[N];

for(j=0;j<N;j++)
{
printf("the %dth student name=",j+1);

scanf("%s",&s1[j].name);

printf("input the three score=");

for(i=0;i<3;i++)
{
scanf("%s",&s1[j].score[i]);

}
}

if((fp=fopen("file.dat","w"))==NULL)
{
printf("file open error\n");
exit(0);
}

j=sizeof(struct student);

for(i=0;i<N;i++)
{

if(fwrite(&s1[i],j,1,fp)!=1)

{
printf("file write error\n");
exit(0);
}

}

fflush(fp);
printf("file successful\n");

rewind(fp);

printf("begin to read\n");

for(i=0;i<N;i++)
{
fread(&s2[i],j,1,fp);

printf("%s,%d\n",s2[i].name,s2[i].score);
}
fclose(fp);

}

...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2014-11-06
  • 打赏
  • 举报
回复
fopen的参数的意义要好好理解
biange2019 2014-11-06
  • 打赏
  • 举报
回复
好人啊,昨天晚上一晚上都没有做出来。结果看来基础还是没有打牢固
lx624909677 2014-11-06
  • 打赏
  • 举报
回复
fwrite是以二进制的方式想写入文件的,你看到的当然是乱码了
mymtom 2014-11-06
  • 打赏
  • 举报
回复
还有两处 小修改

#include<stdio.h>
#include<stdlib.h>

#define N 2

int main(void )
{
    FILE    *fp;
    int     i, j;

    struct student {
        char        name[30];
        float       score[3];
    };

    struct student  s1[N], s2[N];

    for (j = 0; j < N; j++) {
        printf("the %dth student name=", j + 1);

        scanf("%s", &s1[j].name);

        printf("input the three score=");

        for (i = 0; i < 3; i++) {
            /* 修改 */
            scanf("%f", &s1[j].score[i]);

        }
    }

    /* 修改 */
    if ((fp = fopen("file.dat", "w+b")) == NULL) {
        printf("file open error\n");
        exit(0);
    }
    j = sizeof(struct student);

    for (i = 0; i < N; i++) {

        if (fwrite(&s1[i], j, 1, fp) != 1) {
            printf("file write error\n");
            exit(0);
        }
    }

    fflush(fp);
    printf("file successful\n");

    rewind(fp);

    printf("begin to read\n");

    for (i = 0; i < N; i++) {
        fread(&s2[i], j, 1, fp);

        /* 修改 */
        printf("%s,%f,%f,%f\n", s2[i].name, s2[i].score[0], s2[i].score[1], s2[i].score[2]);
    }
    fclose(fp);

}
mymtom 2014-11-06
  • 打赏
  • 举报
回复
楼主在Windows下吗? if((fp=fopen("file.dat","w"))==NULL) 改为 if((fp=fopen("file.dat","w+b"))==NULL)
707wk 2014-11-06
  • 打赏
  • 举报
回复
文件打开有文本和二进制两种模式
赵4老师 2014-11-06
  • 打赏
  • 举报
回复
不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧