鱼C论坛

 找回密码
 立即注册
查看: 1292|回复: 4

[已解决]求助一个fwite的问题

[复制链接]
发表于 2021-3-9 10:52:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct student
  4. {
  5.     int num;
  6.     char name[20];
  7.     int age;
  8. }student;

  9. int main()
  10. {
  11.     student stu1;
  12.     FILE *fp;
  13.     fp = fopen("C:\\Users\\yyp\\Desktop\\t3.txt","wb");
  14.     printf("Please input :\n");
  15.     scanf("%d %s %d",&stu1.num,&stu1.name,&stu1.age);

  16.     if(fp == NULL)
  17.     {
  18.         printf("ERROR!\n");
  19.         exit(0);
  20.     }
  21.     else
  22.     {
  23.         fwrite(&stu1,sizeof(stu1),1,fp);
  24.     }
  25.     fclose(fp);
  26.     return 0;

  27. }
复制代码



大佬们

代码如上,为什么输入比如说 11 Alex 22 这种的时候,打开txt文档看到的 只有Alex正常输出 而其他数字都乱码了呢?
最佳答案
2021-3-9 11:10:16
本帖最后由 jackz007 于 2021-3-9 11:25 编辑

        首先,这一句写错了
  1.         scanf("%d %s %d",&stu1.num,&stu1.name,&stu1.age) ;
复制代码

        应该改成这样
  1.         scanf("%d%s%d",&stu1.num,stu1.name,&stu1.age) ;
复制代码

        其次,这一句
  1.     fp = fopen("C:\\Users\\yyp\\Desktop\\t3.txt","wb");
复制代码

        代表你所创建的文件是一个二进制的文件,这个文件中储存了一个结构数据,这个结构的 num 和 age 成员是整型数,文件中保存的是它们二进制的编码,也就是它们实际的内存映像,是不能通过肉眼直接看到的; name 成员保存的是文本,也就是字符串,是可以通过肉眼直接看到的。
        如果希望文件内容是文本,那就应该这样写代码:
  1. #include<stdio.h>

  2. typedef struct student
  3. {
  4.         int num                                                                    ;
  5.         char name[20]                                                              ;
  6.         int age                                                                    ;
  7. } student                                                                          ;

  8. int main(void)
  9. {
  10.         student stu1                                                               ;
  11.         FILE * fp                                                                  ;
  12.         if((fp = fopen("C:\\Users\\yyp\\Desktop\\t3.txt","w")) != NULL) {
  13.                 printf("Please input : ")                                          ;
  14.                 scanf("%d%s%d" , & stu1 . num , stu1 . name , & stu1 . age)        ;
  15.                 fprintf(fp , "%d %s %d\n" , stu1 . num , stu1 . name , stu1 . age) ; // 通过 fprintf() 函数把结构成员的内容显示成肉眼可辨的文本
  16.                 fclose(fp)                                                         ;
  17.         } else {
  18.                 fprintf(stderr , "ERROR!\n")                                       ;
  19.         }
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-9 11:00:03 From FishC Mobile | 显示全部楼层
应该写入ascii版本的数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 11:10:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-3-9 11:25 编辑

        首先,这一句写错了
  1.         scanf("%d %s %d",&stu1.num,&stu1.name,&stu1.age) ;
复制代码

        应该改成这样
  1.         scanf("%d%s%d",&stu1.num,stu1.name,&stu1.age) ;
复制代码

        其次,这一句
  1.     fp = fopen("C:\\Users\\yyp\\Desktop\\t3.txt","wb");
复制代码

        代表你所创建的文件是一个二进制的文件,这个文件中储存了一个结构数据,这个结构的 num 和 age 成员是整型数,文件中保存的是它们二进制的编码,也就是它们实际的内存映像,是不能通过肉眼直接看到的; name 成员保存的是文本,也就是字符串,是可以通过肉眼直接看到的。
        如果希望文件内容是文本,那就应该这样写代码:
  1. #include<stdio.h>

  2. typedef struct student
  3. {
  4.         int num                                                                    ;
  5.         char name[20]                                                              ;
  6.         int age                                                                    ;
  7. } student                                                                          ;

  8. int main(void)
  9. {
  10.         student stu1                                                               ;
  11.         FILE * fp                                                                  ;
  12.         if((fp = fopen("C:\\Users\\yyp\\Desktop\\t3.txt","w")) != NULL) {
  13.                 printf("Please input : ")                                          ;
  14.                 scanf("%d%s%d" , & stu1 . num , stu1 . name , & stu1 . age)        ;
  15.                 fprintf(fp , "%d %s %d\n" , stu1 . num , stu1 . name , stu1 . age) ; // 通过 fprintf() 函数把结构成员的内容显示成肉眼可辨的文本
  16.                 fclose(fp)                                                         ;
  17.         } else {
  18.                 fprintf(stderr , "ERROR!\n")                                       ;
  19.         }
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 11:19:39 | 显示全部楼层
数字和字符有什么区别?
  1. #include <stdio.h>

  2. int main(void) {
  3.     printf("%c\n", 48);
  4.     printf("%c\n", 49);
  5.     printf("%c\n", 50);
  6.     printf("%c\n", 51);
  7.     printf("%c\n", 52);
  8.     printf("%c\n", 53);
  9.     printf("%c\n", 54);
  10.     printf("%c\n", 55);
  11.     printf("%c\n", 56);
  12.     printf("%c\n", 57);
  13.     return 0;
  14. }
复制代码

  1. $ ./main.exe
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-11 09:49:17 | 显示全部楼层
jackz007 发表于 2021-3-9 11:10
首先,这一句写错了

        应该改成这样
  1.         scanf("%d %s %d",&stu1.num,&stu1.name,&stu1.age) ;
复制代码


想问为啥不能加空格呢,如果按照我这样写加空格那我输入的时候也加上空格不就是同样的吗
scanf  我 没改
我就把wb改成w就可以正常不乱码了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表