C++如何将含有数字和空格的字符串写入文件夹中?

m0_37969090 2018-05-07 08:13:27
有一个CString类型的变量str,其中存放一组数字,数字与数字间用空格隔开
每写入400个数字后换一行:str+="\n"
总共400行

for(int i=0;i<400*400;i++)
{
strf.Format("%d ", number[i]);//注 这里%d后跟了个空格
str+=strf;
if((i+1)%400==0)
{
str+="\n";
}
}

为什么我在用写入文件时候系统总是自动把数字和空格合成为百分号千分号等乱码输出


用了很多方法
比如WriteString(str) Write(str.GetBuffer(str.GetLength()),str.GetLength())都没用
请问这是什么原因,该怎么解决?
大家验证的时候请把number[i]的值设置为至少有4个不同的值(比如循环存储1,2,3,4,5,6),不知道为什么number中如果存储4个以下的值(比如循环存储0,1,2,3)就可以正常输出
...全文
1079 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_37969090 2018-05-09
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
但要怎么在TXT中显示呢?而且只有在循环输出某几个值的时候才会出现数字空格合并编码的这种情况,其他时候都挺正常的,所以这与二进制储存方式没多大关系吧
m0_37969090 2018-05-09
  • 打赏
  • 举报
回复
引用 18 楼 mewiteor 的回复:
[quote=引用 17 楼 m0_37969090 的回复:] [quote=引用 16 楼 mewiteor 的回复:] 碰巧编码出现了歧义 所以 if (!f.Open(h, CFile::modeCreate | CFile::modeWrite)) 改为 if (!f.Open(h, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode)) 即可
感觉很有道理,但是CFile并不存在typeUnicode这个属性 [/quote] 右键点CFile,转到定义,去看看有没有typeUnicode[/quote] 没有
赵4老师 2018-05-09
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
赵4老师 2018-05-09
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
辶井 2018-05-09
  • 打赏
  • 举报
回复
会不会是编码不一致的原因?
mewiteor 2018-05-09
  • 打赏
  • 举报
回复
引用 17 楼 m0_37969090 的回复:
[quote=引用 16 楼 mewiteor 的回复:] 碰巧编码出现了歧义 所以 if (!f.Open(h, CFile::modeCreate | CFile::modeWrite)) 改为 if (!f.Open(h, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode)) 即可
感觉很有道理,但是CFile并不存在typeUnicode这个属性 [/quote] 右键点CFile,转到定义,去看看有没有typeUnicode
白色一大坨 2018-05-08
  • 打赏
  • 举报
回复
写字板打开也是正常的:
白色一大坨 2018-05-08
  • 打赏
  • 举报
回复
引用 13 楼 m0_37969090 的回复:
[quote=引用 12 楼 phenix2009 的回复:] 用Windows写字板打开是乱的,但用NotePad打开不是乱码,这个可能跟编码方式有关:
原来只要换个打开方式就可以了,太好了,但是没办法生成直接就能看的txt感觉很麻烦[/quote] 我觉得,有没有可能是工具的错误呢,因为可以打开,可见文件并没有写错
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 12 楼 phenix2009 的回复:
用Windows写字板打开是乱的,但用NotePad打开不是乱码,这个可能跟编码方式有关:
原来只要换个打开方式就可以了,太好了,但是没办法生成直接就能看的txt感觉很麻烦
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 16 楼 mewiteor 的回复:
碰巧编码出现了歧义


所以
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite))
改为
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode))
即可

感觉很有道理,但是CFile并不存在typeUnicode这个属性
白色一大坨 2018-05-08
  • 打赏
  • 举报
回复
用Windows写字板打开是乱的,但用NotePad打开不是乱码,这个可能跟编码方式有关:
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 7 楼 ssm0903030627 的回复:
写返回的那个字符串 谢谢
把代码改成str=Convert(str, 936,CP_UTF8);也不行
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 8 楼 phenix2009 的回复:
跑了一下也没问题啊:

	CStdioFile f;
	CString h = "test.txt";
	CString str = "";
	CString strf = " ";
	if (!f.Open(h, CFile::modeCreate | CFile::modeWrite))
	{
		AfxMessageBox("输出文件打开失败", MB_ICONHAND);
		return;
	}
	
	int CLASS[1600];
	for (int i = 0; i < 1600;i++)
	{
		CLASS[i] = i;
	}

	for (int i = 0; i < 1600; i++)
	{
		strf.Format("%d ", CLASS[i]);
		str += strf;
		if ((i + 1) % 400 == 0)
		{
			str += "\n";
		}
	}

	f.WriteString(str);
	f.Close();
请运行下这个代码,因为我的代码和你的有部分不一样,第一个就是数据量是160000,第二个就是内容是六个数字重复出现 我试你的代码的时候也可以,而且如果只是数字的单个赋值的话,从1到159999也可以不间断的输入到文件中,但就是不能循环输出相同的几个数字

CStdioFile f;
CString h = "test.txt";
CString str = "";
CString strf = " ";
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite))
{
    AfxMessageBox("输出文件打开失败", MB_ICONHAND);
    return;
}
 
int CLASS[160000];
for (int i = 0; i < 160000;i++)
{
    CLASS[i] = i%6; //使6个数字重复出现
}
 
for (int i = 0; i < 160000; i++)
{
    strf.Format("%d ", CLASS[i]);
    str += strf;
    if ((i + 1) % 400 == 0)
    {
        str += "\n";
    }
}
 
f.WriteString(str);
f.Close();
mewiteor 2018-05-08
  • 打赏
  • 举报
回复
碰巧编码出现了歧义


所以
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite))
改为
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode))
即可
白色一大坨 2018-05-08
  • 打赏
  • 举报
回复
跑了一下也没问题啊:


CStdioFile f;
CString h = "test.txt";
CString str = "";
CString strf = " ";
if (!f.Open(h, CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("输出文件打开失败", MB_ICONHAND);
return;
}

int CLASS[1600];
for (int i = 0; i < 1600;i++)
{
CLASS[i] = i;
}

for (int i = 0; i < 1600; i++)
{
strf.Format("%d ", CLASS[i]);
str += strf;
if ((i + 1) % 400 == 0)
{
str += "\n";
}
}

f.WriteString(str);
f.Close();
赵4老师 2018-05-08
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 1 楼 wanggui2015 的回复:
你写文件的代码呢?是你写文件的问题啊。

不是写文件的问题,因为我把%d后的空格去掉之后就可以输出数字了,只是数字间没了间隔而已 见下图

这部分的完整代码见下

CStdioFile f;
CString h=fileoutname+".txt";
CString str="";
CString strf="";
if(!f.Open(h,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox("输出文件打开失败",MB_ICONHAND);
return;
}

for(int i=0;i<400*400;i++)
{
strf.Format("%d",number[i]);
str+=strf;
if((i+1)%400==0)
{
str+="\n";
}
}
f.WriteString(str);
f.Close();
ssm0903030627 2018-05-08
  • 打赏
  • 举报
回复
写返回的那个字符串 谢谢
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
仅这代码没看出有啥问题。 尝试调试,查看str,strf的内容正确与否。 另:检查文件打开/创建是否正确指定了文本模式
和str strf应该没关系,因为我把%d后的空格去掉后就可以写出数字了,只是数字间没了间隔,图片在4楼 另外文件创建与写入的方式分别为modeCreate modeWrite不知道这个有没有影响,难道要用typebinary?
m0_37969090 2018-05-08
  • 打赏
  • 举报
回复
引用 3 楼 ssm0903030627 的回复:
应该是字节序的问题,你把你需要保存的字符串先转换成UTF-8再保存试试。这是函数代码,希望对你有用。如:Convert(str, 936,CP_UTF8);(936表示多字节) CString Convert(CString str, int sourceCodepage, int targetCodepage) { int len=str.GetLength(); int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0); wchar_t* pUnicode; pUnicode=new wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen); BYTE * pTargetData = NULL; int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL); pTargetData=new BYTE[targetLen+1]; memset(pTargetData,0,targetLen+1); WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL); CString rt; rt.Format("%s",pTargetData); delete pUnicode; delete pTargetData; return rt; }
改正后的代码如下

	CStdioFile f;
	CString h=fileoutname+".txt";
	CString str="";
	CString strf="";
	if(!f.Open(h,CFile::modeCreate|CFile::modeWrite))
	{
		AfxMessageBox("输出文件打开失败",MB_ICONHAND);
		return;
	}

	for(int i=0;i<Rows*Cols;i++)
	{
		strf.Format("%d ",CLASS[i]);
		str+=strf;
		if((i+1)%Cols==0)
		{
			str+="\n";
		}
	}
	Convert(str, 936,CP_UTF8);//(936表示多字节)
	f.WriteString(str);
	f.Close();
但是结果依旧
加载更多回复(3)
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧