VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 297|回复: 3

[已解决]如何用CString写到文件呢

[复制链接]
20_avatar_middle
最佳答案
0 
在线会员 发表于 2020-9-18 16:20:14 | 显示全部楼层 |阅读模式
5驿站币
int 写到文件(CString 文件路径, CString 要写入的内容){

}

如果想封装一个这样的函数,该怎么写呢,我写出来的文件是乱码

  1. int 写到文件(CString 文件路径, CString 要写入的内容){
  2.         HANDLE handle = CreateFile(
  3.                 文件路径,
  4.                 GENERIC_WRITE | GENERIC_READ,       
  5.                 FILE_SHARE_READ,       
  6.                 NULL,                               
  7.                 CREATE_ALWAYS,       
  8.                 FILE_ATTRIBUTE_NORMAL,       
  9.                 NULL
  10.                 );

  11.         if (handle != INVALID_HANDLE_VALUE){
  12.                 DWORD size;
  13.                 if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength(), &size, NULL)){
  14.                         CloseHandle(handle);
  15.                         return GetLastError();
  16.                 }       
  17.         }
  18.         CloseHandle(handle);
  19. }
复制代码
最佳答案
44_avatar_small
2020-9-18 16:20:15
//工程编码如果是Unicode,乱码问题可能出在宽窄字节上

//方法一:写入unicode头字节(目标文件会被修改成Unicode编码,不需要手动修改)

  1. int 写到文件(CString 文件路径, CString 要写入的内容){
  2.         HANDLE handle = CreateFile(
  3.                 文件路径,
  4.                 GENERIC_WRITE | GENERIC_READ,
  5.                 FILE_SHARE_READ,
  6.                 NULL,
  7.                 CREATE_ALWAYS,
  8.                 FILE_ATTRIBUTE_NORMAL,
  9.                 NULL
  10.                 );

  11.         if (handle != INVALID_HANDLE_VALUE){
  12.                 DWORD size;

  13.                 DWORD headbyte = 0xFEFF;                                                                                                                                        //增加部分代码-定义Unicode头字节
  14.                 WriteFile(handle, &headbyte, sizeof(headbyte), &size, NULL);                                        //增加部分代码-写入Unicode头字节

  15.                 //if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength(), &size, NULL)){                        //注释原有部分代码
  16.                 if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength()*sizeof(TCHAR), &size, NULL)){        //修改部分代码-nNumberOfBytesToWrite为字节数不是字符数
  17.                         CloseHandle(handle);
  18.                         return GetLastError();
  19.                 }
  20.         }
  21.         CloseHandle(handle);
  22.         return 1;                                                                                                                                                                                                                //增加部分代码-补齐函数返回类型
  23. }
复制代码


//方法二:CString转成窄字节写入文件(目标文件为Ansi编码不改变)
  1. int 写到文件(CString 文件路径, CString 要写入的内容)
  2. {
  3.         HANDLE handle = CreateFile(
  4.                 文件路径,
  5.                 GENERIC_WRITE | GENERIC_READ,
  6.                 FILE_SHARE_READ,
  7.                 NULL,
  8.                 CREATE_ALWAYS,
  9.                 FILE_ATTRIBUTE_NORMAL,
  10.                 NULL
  11.                 );

  12.         if (handle != INVALID_HANDLE_VALUE){
  13.                 DWORD size;

  14.                 int len = WideCharToMultiByte(CP_ACP, 0, 要写入的内容, -1, NULL, 0, NULL, NULL);                //增加部分代码-返回长度
  15.                 char *pAnsibuf = new char[len + 1];                                                                                                                                                                                //增加部分代码
  16.                 WideCharToMultiByte(CP_ACP, 0, 要写入的内容, -1, pAnsibuf, len, NULL, NULL);                                //增加部分代码-宽窄转换
  17.                 int lenAnsi = strlen(pAnsibuf);                                                                                                                                                                                                //增加部分代码
  18.                 //if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength(), &size, NULL)){                                        //注释原有部分代码
  19.                 if (!WriteFile(handle, pAnsibuf, lenAnsi, &size, NULL)){                                                                                                                        //修改部分代码                                               
  20.                         CloseHandle(handle);
  21.                         delete[] pAnsibuf;                                                                                                                                                                                                                                //增加部分代码
  22.                         return GetLastError();
  23.                 }
  24.                 delete[] pAnsibuf;                                                                                                                                                                                                                                        //增加部分代码      
  25.         }
  26.         CloseHandle(handle);
  27.         return 1;                                                                                                                                                                                                                                                                        //增加部分代码-函数补齐返回类型
  28. }
复制代码


//方法三
//MFC编程建议使用CFile类,与CString相对契合,具体使用方法老沈在C/C++基础班教程中有讲,
//以上内容为个人经验分享,如有错误或不足,望指正如何用CString写到文件呢.

最佳答案

查看完整内容

//工程编码如果是Unicode,乱码问题可能出在宽窄字节上 //方法一:写入unicode头字节(目标文件会被修改成Unicode编码,不需要手动修改) //方法二:CString转成窄字节写入文件(目标文件为Ansi编码不改变) //方法三 //MFC编程建议使用CFile类,与CString相对契合,具体使用方法老沈在C/C++基础班教程中有讲, //以上内容为个人经验分享,如有错误或不足,望指正.




上一篇:VS2013制作电子相册,按钮往左后退怎么处理
下一篇:赋值
44_avatar_middle
最佳答案
2 
在线会员 发表于 2020-9-18 16:20:15 | 显示全部楼层    本楼为最佳答案   
bestAnswer
//工程编码如果是Unicode,乱码问题可能出在宽窄字节上

//方法一:写入unicode头字节(目标文件会被修改成Unicode编码,不需要手动修改)

  1. int 写到文件(CString 文件路径, CString 要写入的内容){
  2.         HANDLE handle = CreateFile(
  3.                 文件路径,
  4.                 GENERIC_WRITE | GENERIC_READ,
  5.                 FILE_SHARE_READ,
  6.                 NULL,
  7.                 CREATE_ALWAYS,
  8.                 FILE_ATTRIBUTE_NORMAL,
  9.                 NULL
  10.                 );

  11.         if (handle != INVALID_HANDLE_VALUE){
  12.                 DWORD size;

  13.                 DWORD headbyte = 0xFEFF;                                                                                                                                        //增加部分代码-定义Unicode头字节
  14.                 WriteFile(handle, &headbyte, sizeof(headbyte), &size, NULL);                                        //增加部分代码-写入Unicode头字节

  15.                 //if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength(), &size, NULL)){                        //注释原有部分代码
  16.                 if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength()*sizeof(TCHAR), &size, NULL)){        //修改部分代码-nNumberOfBytesToWrite为字节数不是字符数
  17.                         CloseHandle(handle);
  18.                         return GetLastError();
  19.                 }
  20.         }
  21.         CloseHandle(handle);
  22.         return 1;                                                                                                                                                                                                                //增加部分代码-补齐函数返回类型
  23. }
复制代码


//方法二:CString转成窄字节写入文件(目标文件为Ansi编码不改变)
  1. int 写到文件(CString 文件路径, CString 要写入的内容)
  2. {
  3.         HANDLE handle = CreateFile(
  4.                 文件路径,
  5.                 GENERIC_WRITE | GENERIC_READ,
  6.                 FILE_SHARE_READ,
  7.                 NULL,
  8.                 CREATE_ALWAYS,
  9.                 FILE_ATTRIBUTE_NORMAL,
  10.                 NULL
  11.                 );

  12.         if (handle != INVALID_HANDLE_VALUE){
  13.                 DWORD size;

  14.                 int len = WideCharToMultiByte(CP_ACP, 0, 要写入的内容, -1, NULL, 0, NULL, NULL);                //增加部分代码-返回长度
  15.                 char *pAnsibuf = new char[len + 1];                                                                                                                                                                                //增加部分代码
  16.                 WideCharToMultiByte(CP_ACP, 0, 要写入的内容, -1, pAnsibuf, len, NULL, NULL);                                //增加部分代码-宽窄转换
  17.                 int lenAnsi = strlen(pAnsibuf);                                                                                                                                                                                                //增加部分代码
  18.                 //if (!WriteFile(handle, 要写入的内容, 要写入的内容.GetLength(), &size, NULL)){                                        //注释原有部分代码
  19.                 if (!WriteFile(handle, pAnsibuf, lenAnsi, &size, NULL)){                                                                                                                        //修改部分代码                                               
  20.                         CloseHandle(handle);
  21.                         delete[] pAnsibuf;                                                                                                                                                                                                                                //增加部分代码
  22.                         return GetLastError();
  23.                 }
  24.                 delete[] pAnsibuf;                                                                                                                                                                                                                                        //增加部分代码      
  25.         }
  26.         CloseHandle(handle);
  27.         return 1;                                                                                                                                                                                                                                                                        //增加部分代码-函数补齐返回类型
  28. }
复制代码


//方法三
//MFC编程建议使用CFile类,与CString相对契合,具体使用方法老沈在C/C++基础班教程中有讲,
//以上内容为个人经验分享,如有错误或不足,望指正如何用CString写到文件呢.
04_avatar_middle
最佳答案
7 
online_vip 发表于 2020-9-18 18:22:24 | 显示全部楼层
你用了UNICODE编码了吧,如果是的话需要先写入UNICODE编码的标记才行,如果直接是ANSI编码应该不会出现乱码
53_avatar_middle
最佳答案
2 
在线会员 发表于 2020-9-20 15:22:12 | 显示全部楼层
如果是写入txt文件,你为什么不用fstream?那个更简单,把参数Ctring类型转化char*(也可以先转string,然后调用string.c_str()) 然后直接用“<<”输出符写入就行
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-27 02:04

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表