请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

2.3节crtsurfdata2.log文件显示出现乱码

老师您好,我想请问一下后续拆分字符串并用for循环输出vstcode每行信息的时候,日志crtsrrfdata2.cpp每一行中文都变成了乱码一样的文字,这个怎么解决?再在这之前单独显示一整行没切分之前的数据是正常的。provname、obtid、obtname等字符类型的数值都变成了蓝色字体所示的乱码,请问该如何解决呢

struct st_stcode
{
  char provname[31]; //省
  char obtid[11];    //站号
  char obtname[31];   //站名
  double lat;        //纬度
  double lon;        //经度 
  double height;     //海拔高
};

//存放全国气象站点参数文件
vector<struct st_stcode> vstcode;

//把站点参数文件加载到vstcode容器中
bool LoadSTCode(const char *inifile);
CLogFile logfile;

int main(int argc, char *argv[]){
      //inifile outpath logfile
      if(argc != 4){
      printf("Using: ./crtsurfdata2 inifile outpath\n");
      printf("Example: /project/idc1/bin/crtsurfdata2 /project/idc1/ini/stcode.ini /tmp/surfdata /log/idc/crtsurfdata2.log\n\n");

      printf("inifile 全国气象站点参数文件名。\n");
      printf("outpath 全国气象站点数据文件存放的目录。\n");
      printf("logfile 本程序运行的日志文件名。\n\n");
      return -1;
      }
      if(logfile.Open(argv[3],"a+",false) == false){
        printf("logfile.Open(%s) failed.\n", argv[3]); return -1;

      }

      logfile.Write("crtsurfdata2 开始运行。\n");

      //这里插入业务代码
      //把站点参数文件加载到vstcode容器中。
      if(LoadSTCode(argv[1])==false) return -1;


      logfile.WriteEx("crtsurfdata2 运行结束。\n");
    return 0;
}

bool LoadSTCode(const char *inifile)
{
  CFile File;

  //打开站点参数文件。
  if(File.Open(inifile,"r")==false)
  {
    logfile.Write("File.Open(%s) failed.\n",inifile); return false;

  }

  char strBuffer[301];

  CCmdStr CmdStr;

  struct st_stcode stcode;

  while(true)
  {
    //从站点参数文件中读取一行,如果已读取完,跳出循环。
    if(File.Fgets(strBuffer,300,true)==false) break;


    //把读取到的一行拆分
    CmdStr.SplitToCmd(strBuffer,",");

    //把站点参数的每个数据项保存到站点参数结构体中。
    CmdStr.GetValue(0, stcode.provname,30);  //省
    CmdStr.GetValue(1, stcode.obtid,10);     //站号
    CmdStr.GetValue(2, stcode.obtname,30);    //站名
    CmdStr.GetValue(3,&stcode.lat);         //纬度
    CmdStr.GetValue(4,&stcode.lon);         //经度
    CmdStr.GetValue(5,&stcode.height);      //海拔高度

    //把站点参数结构体放入站点参数容器。
    vstcode.push_back(stcode);

  }
  for (int ii = 0; ii < vstcode.size(); ii++)
    logfile.Write("provname=%s,obtid=%s,obtname=%s,lat=%.2f,lon=%.2f,height=%.2f\n",vstcode[ii].provname,vstcode[ii].obtid,vstcode[ii].obtname,vstcode[ii].lat,vstcode[ii].lon,vstcode[ii].height);

  //关闭文件。


  return true;
  }
  

上面是我crtsurfdata2.cpp的代码我反复检查了应该是没有问题的,希望老师能够解惑,谢谢。

使用如下代码可以输出下图结果,中文显示正常

 for (int ii = 0; ii < vstcode.size(); ii++)
  {
   logfile.Write(vstcode[ii].provname,vstcode[ii].obtid,vstcode[ii].obtname,vstcode[ii].lat,vstcode[ii].lon,vstcode[ii].height);
  }

图片描述
我不明白为什么logfile.Write("provname=%s,obtid=%s,obtname=%s,lat=%.2f,lon=%.2f,height=%.2f\n",vstcode[ii].provname,vstcode[ii].obtid,vstcode[ii].obtname,vstcode[ii].lat,vstcode[ii].lon,vstcode[ii].height);
就是不可以正常输出

正在回答 回答被采纳积分+3

8回答

一点积分 2022-07-28 20:25:33

确定了,是初始化的问题,没有初始化的情况下,使用类似printf那种写法,当从首行那个标题读取的时候,使用vi打开时会出现乱码的现象,加一个memset就行了,就不会出现乱码了。

老师的源码如果把memset和那个扔掉首行的一行命令行去掉,用vi打开也会出现乱码

大家使用数组时还是记得初始化,搞了我快1天了

自动判断中文中文(简体)中文(香港)中文(繁体)英语日语朝鲜语德语法语俄语泰语南非语阿拉伯语阿塞拜疆语比利时语保加利亚语加泰隆语捷克语威尔士语丹麦语第维埃语希腊语世界语西班牙语爱沙尼亚语巴士克语法斯语芬兰语法罗语加里西亚语古吉拉特语希伯来语印地语克罗地亚语匈牙利语亚美尼亚语印度尼西亚语冰岛语意大利语格鲁吉亚语哈萨克语卡纳拉语孔卡尼语吉尔吉斯语立陶宛语拉脱维亚语毛利语马其顿语蒙古语马拉地语马来语马耳他语挪威语(伯克梅尔)荷兰语北梭托语旁遮普语波兰语葡萄牙语克丘亚语罗马尼亚语梵文北萨摩斯语斯洛伐克语斯洛文尼亚语阿尔巴尼亚语瑞典语斯瓦希里语叙利亚语泰米尔语泰卢固语塔加路语茨瓦纳语土耳其语宗加语鞑靼语乌克兰语乌都语乌兹别克语越南语班图语祖鲁语自动选择中文中文(简体)中文(香港)中文(繁体)英语日语朝鲜语德语法语俄语泰语南非语阿拉伯语阿塞拜疆语比利时语保加利亚语加泰隆语捷克语威尔士语丹麦语第维埃语希腊语世界语西班牙语爱沙尼亚语巴士克语法斯语芬兰语法罗语加里西亚语古吉拉特语希伯来语印地语克罗地亚语匈牙利语亚美尼亚语印度尼西亚语冰岛语意大利语格鲁吉亚语哈萨克语卡纳拉语孔卡尼语吉尔吉斯语立陶宛语拉脱维亚语毛利语马其顿语蒙古语马拉地语马来语马耳他语挪威语(伯克梅尔)荷兰语北梭托语旁遮普语波兰语葡萄牙语克丘亚语罗马尼亚语梵文北萨摩斯语斯洛伐克语斯洛文尼亚语阿尔巴尼亚语瑞典语斯瓦希里语叙利亚语泰米尔语泰卢固语塔加路语茨瓦纳语土耳其语宗加语鞑靼语乌克兰语乌都语乌兹别克语越南语班图语祖鲁语百度翻译谷歌翻译谷歌翻译(国内)翻译朗读复制正在查询,请稍候……重试朗读复制复制朗读复制来源 谷歌翻译(国内)
2 回复 有任何疑惑可以回复我~
一点积分 2022-07-28 16:54:50

兄弟,我也出现了这个问题,但是我可以回答你最后一个问题,不是这个logfile.write不能这么写,而是ii不能等于0,我也测试了很多次。发现。

第一如果你不用vi编辑,采用cat命令查看或者视频中演示的tail命令查看日志文件,是完全没有问题的,都能正常显示。


第二如果你采用vi编辑,我目前验证发现,当ii=0时,后续日志的写入中就会出现乱码, 将数据进行切分后,尝试不进入循环,单出一行ii=0时,写入日志文件。实测发现会出现乱码。此时将ii=1代入原行,实测发现乱码情况消失。

https://img1.sycdn.imooc.com//szimg/62e2475a0939fa5600000000.jpg

https://img1.sycdn.imooc.com//szimg/62e247d809728d2e18770611.jpg

第三 后续进行测试,循环中将ii初始化为1,编译运行文件后,实测采用vi打开日志文件没有出现乱码。


问题分析:采用cat或者tail时发现,当ii=0时,第一个字符直接将4个中文标题读取了,后续为0.https://img1.sycdn.imooc.com//szimg/62e248a709bbf7f008910084.jpg

https://img1.sycdn.imooc.com//szimg/62e24b5d090b34cd00000000.jpg


猜测:vi编辑器中的环境参数未设置好等其他原因,导致在i=0时读取前面标题时 后续为空,导致首行读取失败,显示乱码。

解决办法:直接一步到位,不取第一行标题 的无效数据,令ii=1开始,实测解决。‘

附:但是其中具体原因确实不是很清楚,只能是猜测和读取第一行数据时,未有有效值造成,猜测另外命令和vi不属于同一类别,所以能够正常显示。


1 回复 有任何疑惑可以回复我~
长歌_吴从周 2022-10-16 21:23:42

这不是程序功能的问题,肯定是字符集的问题。

课程要求操作系统、数据库和SecureCRT的字符集都用utf-8,你再认真检查一下。

0 回复 有任何疑惑可以回复我~
ModelSue 2022-08-02 18:06:12

兄弟你解决了吗,为啥我还没有解决呢

0 回复 有任何疑惑可以回复我~
一点积分 2022-07-28 17:16:09


0 回复 有任何疑惑可以回复我~
  • 我改了下如果ii<一个确切的数还是能够显示的
    回复 有任何疑惑可以回复我~ 2022-07-28 17:44:25
长歌_吴从周 2022-07-28 17:01:44

我看不出来,要调试了才知道,你直接用我的代码测试看有没有问题。

0 回复 有任何疑惑可以回复我~
  • 老师你好,我刚刚的回答,重新保存下就全没了,我这看不到了。
    总结就是因为那个ii=0时,第一行的标题都在provname这个字符串里面了,导致后面出现乱码,直接不读取第一行,从ii=1开始就没问题了。
    回复 有任何疑惑可以回复我~ 2022-07-28 17:14:23
  • 我刚刚测试了下您的原代码,好像用vi打开也是报错的,这个里面放不了截图
    回复 有任何疑惑可以回复我~ 2022-07-28 17:15:13
  • 抱歉,老师的源代码没有问题的
    回复 有任何疑惑可以回复我~ 2022-07-28 19:34:23
蜗牛7150515 2022-06-24 10:40:39
兄弟,你解决了吗,我也是这个问题
0 回复 有任何疑惑可以回复我~
  • 我也搞不明白你们怎么会出现这种问题。
    加665410399群里来啊。
    回复 有任何疑惑可以回复我~ 2022-06-24 11:43:53
  • 我把去首行的代码注释了,就会乱码,不去就正常,
    回复 有任何疑惑可以回复我~ 2022-07-30 11:39:44
长歌_吴从周 2022-06-18 23:17:34

乱码是由环境变量和参数引起的,与代码无关。

解决这个问题很容易,你可能对linux不太熟悉,才会觉得麻烦。

你加入665410399群中来,方便沟通,如果解决不了,私信我。

我不清楚你乱码的原因,看不出来。

0 回复 有任何疑惑可以回复我~
  • 吴哥,我也是这样,中文变成乱码,其他正常
    回复 有任何疑惑可以回复我~ 2022-06-21 16:53:17
  • 这是项目实战课程,有问题不是看一下代码就能解决的,要多次沟通和测试。
    
    乱码肯定是由环境变量和参数引起的,与代码无关。
    
    你加入665410399群中来,方便沟通,如果解决不了,私信我。
    回复 有任何疑惑可以回复我~ 2022-06-21 17:59:10
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信