C语言文件输出时,输入数据后为啥会出现乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言文件输出时,输入数据后为啥会出现乱码相关的知识,希望对你有一定的参考价值。

源代码及测试结果如下
#include"stdio.h"
#define SIZE 2
struct studentType

char name[10];
int num;
int age;
char addr[15];
stud[SIZE];
void save()

FILE *fp;
int i;
if((fp=fopen("stuList","w"))==NULL)

printf("cannot open the file\n");
return;

for(i=0;i<SIZE;i++)

if(fwrite(&stud[i],sizeof(struct studentType),1,fp)!=1)
printf("file write error!\n");

fclose(fp);

int main()

int i;
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save();

输入数据

结果

if(fwrite(&stud[i],sizeof(struct studentType),1,fp)!=1) 简单看了下,这行有问题,往文件里写的时候是把一个字符串写进去,stud[i]是一个struct,强行把它序列化的话,内存中的存储不是连续的,这样写就会写入一些没用的数据,导致出错。考虑一下怎么把struct序列化,再看看struct的中的字节是怎么对齐的,建议而已 参考技术A fwrite(&stud[i],sizeof(struct studentType),1,fp)

你这种写入方式是直接将这个数据的内存原封不动的拷贝到文件当中。

在C语言中,内存中的结构体的存储并不是所有数据连续的。
你可以在网络上搜索一下结构体的对齐原则。
这种原则是C语言中,结构体存储结构的原理。

如果你希望能更好的理解。
参考技术B 可能是输入缓冲区之前未清空
使用这个函数将文件缓冲区清空
memset(buffer,0,sizeof(buffer));
头文件在#include<stdlib.h>中
参考技术C fwrite函数保存数据时整型数据将会保存为对应的ASCII字符
比如48就会被保存为‘0’

如何解决Eclipse调试程序时乱码问题

1.第一个地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。
  第二处编码为解码格式。因为存为UTF-8的文件被解码为iso8859-1,这样如有中文肯定出乱码。也就是必须一致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话,“我是个好人”也会出现乱码。必须一致才可以。
 第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。出现了乱码。
2.表单使用Post方式提交后接收到的乱码问题
这个问题也是一个常见的问题。这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。导致乱码。既然这样的原因,下面有几种解决方式,并比较。
A,接受参数时进行编码转换
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-
8") ; 这样的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。
B,在请求页面上开始处,执行请求的编码代码, request.setCharacterEncoding("UTF-8"),把提交内容的字符集设为UTF-8。这样的话,接受此参数的页面就不必在转码了。直接使用  String str = request.getParameter("something");即可得到汉字参数。但每页都需要执行这句话。这个方法也就对post提交的有效果,对于get提交和上传文件时enctype="multipart/form-data"是无效的。稍后下面单独对这个两个的乱码情况再进行说明。
C,为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有jsp。

现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。

  1)JSP页面中显示中文乱码

  在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java"

contentType="text/html;charset=gb2312" %>

  2)表单提交乱码

  表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交
参考技术A 1、找到工程中jar引用目录,不同类型的项目不同,以普通web项目为例,找到调试的bdf2-export-2.0.8-20151225.023516-9.jar:
2、选中bdf2-export-2.0.8-20151225.023516-9.jar,点击右键,打开buildpath
3、打开对话框中选中之前bdf2-export-2.0.8-20151225.023516-9.jar,展开选中source attachment节点,然后点击右侧Edit...,
4、在对话框中,修改encoding,修改为utf-8点击确定,然后重新调试或者打开之前的类即可。(因为不同source可能采用了不同的编码,这里的encoding没有选择为相同的编码所以才导致的乱码,一般情况下要么utf-8,要么gbk。即使不知道,选择为另一种编码试一试即可。)

以上是关于C语言文件输出时,输入数据后为啥会出现乱码的主要内容,如果未能解决你的问题,请参考以下文章

c语言如果用字符串类型输出字符数组,字符数组最后一个是0,那么为啥会出现乱码

c语言输出字符串数组出现乱码

C语言文件问题:为啥下面程序会有乱码输出?

为啥C语言输出文件内容乱码

c语言程序输出的数据后面多了一些乱码

这个C语言程序输入字母会出现死循环,为啥?怎么办?