Code Bye

乱码了,求解啊

 

在vs2010下,将一个数组的值写入文件中,
出现乱码:具体如下:
                                    如果数组中的数据都是个位数,或者数据个数一致,那么这个程序就不会出现乱码。
                                   如果数组中数据的位数不一致 1 12 123 ,那么这个程序就会出现乱码。

具体代码如下:(源程序中截取的一部分,只有这个地方有问题)

for(i = 0 ; i < len ; i++) ///记录循环次数,先选择n-1个数据
{
max = sort[0] ;
jmax = 0 ;

for(j = 0;j < len ; j++ ) //每次查找到一个数据就进行数据的删除以及写入,这里size肯定大于1
{
if( max < sort[j] ) 
{
max = sort[j];    //记录数据并且保存位置
jmax = j ;
}
}
//删除最大值并存入文件,需要转化成字符
char buf[32] = {0};
itoa(max,buf,10);

fwrite(buf,strlen(buf)+1,1,fp2); ///////////?????????????

sort[jmax] = -1 ;

}

从这段程序,看不出会乱码
引用 1 楼 zhangxiangDavaid 的回复:

从这段程序,看不出会乱码

没啦,就是这个问题,你可以复制过去,测试一下。给你两组数据 {1,8,3,6,2,} { 21,4,543,5}肯定会有问题,跟踪一下,我估计是编译器在写数据的时候优化了,具体的原理不确定

这样测试可好:
int main(void)
{
	FILE *fp2;
	fp2 = fopen("1.txt", "wb");
	//int sort[] = { 1, 8, 3, 6, 2 };
	int sort[] = { 21, 4, 543, 5 };
	int len = sizeof(sort) / sizeof(int);
	int max, jmax;
	for (int i = 0; i < len; i++)	 ///记录循环次数,先选择n-1个数据
	{
		max = sort[0];
		jmax = 0;
		for (int j = 0; j < len; j++)	//每次查找到一个数据就进行数据的删除以及写入,这里size肯定大于1
		{
			if (max < sort[j])
			{
				max = sort[j];	    //记录数据并且保存位置
				jmax = j;
			}
		}
		//删除最大值并存入文件,需要转化成字符
		char buf[32] = { 0 };
		_itoa(max, buf, 10);
		fwrite(buf, strlen(buf) + 1, 1, fp2);	 ///////////?????????????
		sort[jmax] = -1;
	}
	fclose(fp2);
	return 0;
}

引用 3 楼 zhangxiangDavaid 的回复:

这样测试可好:

int main(void)
{
	FILE *fp2;
	fp2 = fopen("1.txt", "wb");
	//int sort[] = { 1, 8, 3, 6, 2 };
	int sort[] = { 21, 4, 543, 5 };
	int len = sizeof(sort) / sizeof(int);
	int max, jmax;
	for (int i = 0; i < len; i++)	 ///记录循环次数,先选择n-1个数据
	{
		max = sort[0];
		jmax = 0;
		for (int j = 0; j < len; j++)	//每次查找到一个数据就进行数据的删除以及写入,这里size肯定大于1
		{
			if (max < sort[j])
			{
				max = sort[j];	    //记录数据并且保存位置
				jmax = j;
			}
		}
		//删除最大值并存入文件,需要转化成字符
		char buf[32] = { 0 };
		_itoa(max, buf, 10);
		fwrite(buf, strlen(buf) + 1, 1, fp2);	 ///////////?????????????
		sort[jmax] = -1;
	}
	fclose(fp2);
	return 0;
}

不好意思啊,我把完整的代码贴出来,麻烦您看一下,谢谢啦。
程序的任务是:从一个文件中读取出一个数组,排好序后再次写入一个文件。
#include<vector>

using namespace std ;

bool change(const char* pfile1,const char* pfile2)
{
char ch ;
int temp = 0 ;
int sort[2048]={0} ;

int len = 0 ;
int i = 0;
int j = 0 ; //记录临时位置
int max = 0 ;
int jmax = 0 ;

FILE* fp1 = fopen(pfile1,”rb”);
if( fp1 == NULL )
{
cout<<” func fopen(file1) eror!”<<endl;
goto END ;
}
FILE* fp2 = fopen(pfile2,”wb”);
if( fp2 == NULL )
{
cout<<” func fopen(file2) eror!”<<endl;
goto END ;
}

while( !feof(fp1) )   ///从文件中读取数据,一个字符一个字符的读出,同时进行转成整数
{
fread(&ch,1,1,fp1);
if( ch >= “”0″” && ch <= “”9″” )
{
temp= temp*10 + ch – “”0″” ;
}
if( ch == “” “” && !feof(fp1) ) //此时表示一个数据的读取完成,将数据存储在临时变量中
{
sort[len++] = temp ;
temp = 0 ;
}
}
//对读取出来的sort数据进行排序

for(i = 0 ; i < len ; i++) ///记录循环次数,先选择n-1个数据
{
max = sort[0] ;
jmax = 0 ;

for(j = 0;j < len ; j++ ) //每次查找到一个数据就进行数据的删除以及写入,这里size肯定大于1
{
if( max < sort[j] ) 
{
max = sort[j];    //记录数据并且保存位置
jmax = j ;
}
}
//删除最小值并存入文件,需要转化成字符
char buf[32] = {0};
_itoa(max,buf,10);
//注意这个地方对不对?strlen字符串的有效位数,
fwrite(buf,strlen(buf)+1,1,fp2); ///////////?????????????

sort[jmax] = -1 ;

}

END:
if( fp1 != NULL )
{
fclose(fp1);
}
if( fp2 != NULL )
{
fclose(fp2);
}
return true ;
}

int main()
{
int res = 0 ;

char file1[] = “1.txt” ;
char file2[] = “2.txt” ;

change(file1,file2);

system(“pause”);
return res ;
}

经测试,不会乱码,
21 4 543 5    //5后需加一个空格
用fprintf
经测试,不会乱码,char file1[] = “1.txt” ;char file2[] = “2.txt” ;需加上盘符,最后一个数字后无空格的话不会进行复制。
10分
引用 7 楼 jluliuxy 的回复:

经测试,不会乱码,char file1[] = “1.txt” ;char file2[] = “2.txt” ;需加上盘符,最后一个数字后无空格的话不会进行复制。

为什么必须加盘符呢?

5分
二进制文件也可以储存字符型数据,储存方法和文本文件一样。都是使用 ASCII 编码储存的。所以我们用记事本打开某些二进制文件时,也能看到一些有意义的字符串。(无意义的乱码我们可以认为是整型或实型,不过记事本程序当作字符来解释,因此造成了乱码)

http://www.cnblogs.com/flying-roc/articles/1798817.html

测试过了   二进制存储这些整形数据的时候 用的也是ascii码。 具体可以UltraEdit看一下

刚好符合某个字,就解释成乱码了

215 4 6 5
?564

楼主给的2组,都没乱码。。。。
5分
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明乱码了,求解啊