第一个程序: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
欢迎分享,转载请注明来源:内存溢出