'字符,char str[26] 至少要改成 char str[27]2 将字符输入文件时,不要写最后一个字符'', "og:type" content="webpage">'字符,char str[26] 至少要改成 char str[27]2 将字符输入文件时,不要写最后一个字符'', " /> '字符,char str[26] 至少要改成 char str[27]2 将字符输入文件时,不要写最后一个字符'', "> 用C语言编写文件为什么文件里是乱码_CMS教程_内存溢出

阅读 3

用C语言编写文件为什么文件里是乱码,第1张

第一个程序:1 你是想输入26个字母吧,那缓冲区长度不够,结尾要预留一个'\0'

字符,char str[26] 至少要改成 char str[27]2 将字符输入文件时,不要写最后一个字符'\0', fwrite(str,1,27,fp) 改为 fwrite(str,1,26,fp); 原因是,文本文件当中是无须'\0'的,可能会导致

乱码

3 字符读出来了之后,也要加上 str[26] = '\0' 语句

第二个程序:

1 缓冲区不够, char str[26], 改为 char str[27]

2 读取文件函数写错鸟,fwrite 改为 fread; 不要搞 fputs 了,文件是以"r"只读模式打开的

3 假使你把字符读出来了,也要加上 str[26] = '\0' 语句

#include<stdioh>

#include<stdlibh>

int main()

{

char str[100];

FILE fp;

if((fp=fopen("字符串dat","w"))==NULL)

{

printf("can't find the file!\n");exit(0);

}

gets(str);

fwrite(str,1,26,fp);

fclose(fp);

if((fp=fopen("字符串dat","r"))==NULL)

{

printf("can't find the file!\n");exit(0);

}

fread(str,1,26,fp);

str[26] = '\0';

printf("%s\n",str);

fclose(fp);

return 0;

}

#include<stdioh>

#include<stdlibh>

int main()

{

FILE fp;

char str[100];

if((fp=fopen("字符串dat","r"))==NULL)

{

printf("can't find the file!\n");exit(0);

}

fread(str,1,26,fp);

str[26]='\0';

printf("%s\n",str);

fclose(fp);

return 0;

}

这里涉及到一个字符在源代码(文本)中,编译好的二进制文件中,以及最后控制台输出编码形式的区别

首先,要明确一点:C(语言/程序)并不理解ANSI,UTF-8以及任何其他编码它只知道处理你给它的字符的二进制表示

在简体中文Windows下,默认的文本保存编码是ANSI(即GBK);Linux下根据系统locale设定,一般应该是(zh_CNUTF-8)(以下基于简体中文Windows)

1)对于源文件中保存的"中文"这个字符串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(默认ANSI编码得到)但编译器才不管是不是GBK神马的,它就管那串数字

区别,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc默认UTF-8)注意,用MinGW编译的源文件中有中文宽字符必须保存为UTF-8编码

2)然后,在二进制文件中的存储形式,对传统的字符串(char str[] = "中文";),编译器什么都不做,直接把那串数字(如"0xd6d0","0xcec4")搬过去塞进二进制文件

但对于宽字符串(wchar_t wstr[] = L"中文";),编译器会将其做转换,转换成Unicode编码格式(在Windows是UTF-16,而Linux下是UTF-32)如"中文"的16位Unicode是"0x4e2d"和"0x6587",然后把这串转换后的数字("0x4e2d","0x6587")塞进二进制文件中(这里VS和MinGW做的没有区别)

这里有点需要注意,编译器必须知道你的源文件保存的编码!如VS默认是ANSI编码,如果你用UTF-8保存c源文件去用VS打开看一定是乱码同理如果你用mingw编译ANSI编码保存的源文件,也会出错!(但可以修改编译选项解决,见文章末尾) 在本文这里这个原因其实很好理解,因为编译器需要知道,如果它要将一个保存在文件中的字符转成宽字符时,是从什么编码转到Unicode(可见上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)

这个错误的原因是对union的定义不清楚,联合的意思是几个成员共用一个内存空间,但是每个时刻只能有一个成员占用。所以在程序中只有dataa有值,所以可以如下测试下:

#include

<iostream>

#include

<string>

using

namespace

std;

int

main()

{

union

dt

{int

a;char

b;double

c;

}data;

dataa=5;

cout<<"a

=

"<<dataa<<endl;

datac

=

2001;

cout<<"a

=

"<<dataa<<"\t"<<"c

=

"<<datac<<endl;

system("pause");

return

1;

}

此时,dataa的值已经不能正确得到了,只有datac的值。

楼主,我改了一下,改完才发现与楼上一下,给你一个参考吧

#include

<stdioh>

#include

<stringh>

#include

<stdlibh>

int

ntext=0;

char

text[10]={0};

//将其定义成为

外部变量

,你那样定义是不可以的,大小变成只有一个元素了

void

Menu();

void

Entertxt(char

text[]);

/输入/

/输入模块/

void

Entertxt(char

text[])

{

char

c;

int

i=ntext;

system("cls");

printf("输入@结束输入并返回主菜单\n请输入内容\n");

printf("%s",text);

fflush(stdin);

while

((c=getchar())!='@')

{

text[i]=c;

i++;

}

ntext=i;

if(c=='@')

Menu();

}

/菜单显示模块/

void

Menu()

//这里不需要接收

参数

{

char

n;

system("cls");

if

(ntext==0)

{

printf("\t\t\t\t----1输入内容--\n");

printf("\t\t\t\t--选择1

继续输入--\n");

}

else

{

printf("\t\t\t\t----1继续输入--\n");

printf("\t\t\t\t--选择1

继续输入--\n");

}

while

(1)

{

fflush(stdin);

n=getchar();

switch

(n)

{

case

'1':

Entertxt(text);break;

default

:

printf("输入错误!"

);break;

}

}

}

/主函数/

void

main()

{

char

n;

system("cls");

printf("\t\t\t\t--输入1

输入内容--\n");

while

(1)

{

fflush(stdin);

n=getchar();

switch

(n)

{

case

'1':

Entertxt(text);break;

default

:

printf("输入错误!");break;

}

}

}

原因在这里你第一次写入write(fd1, buf_read, 10);的时候buf_read里是随机值。

ret = write(fd , buf, 10);而这里面是hello不会出现乱码。

char buf_read[100] ;

char buf_bu[100];

你把这两行移到 main外面变成全局变量 这样会初始为0

虽然你的名字叫contact_listtxt,但你用fwrite(cp+i,sizeof(CARD),1,fp)写入文件,实际写入的是二进制文件,直接点开contact_listtxt肯定是乱码的。如果不希望这样的话,可以考虑用fprintf写文件,当然了,要自己实现下把CARD和写入字符串的转换。

以上就是关于用C语言编写文件为什么文件里是乱码全部的内容,包括:用C语言编写文件为什么文件里是乱码、C语言控制台程序,中文输出变成乱码,怎么解决、c语言:这个程序为什么输出来是一堆乱码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:
http://outofmemory.cn/zz/10206019.html字符串
编译器
(0) 微信扫一扫 打赏 支付宝扫一扫 微信扫一扫
支付宝扫一扫
柳一村 柳一村
什么是TMP文件怎样打开
上一篇
2023-05-06
怎么使用logo小海龟软件画空心五角星
2023-05-06

发表评论 后才能评论
提交

评论列表(0条)

2022-4-12

南苑
中央国家机关
保存{label} {label} {label} {label}