2.3节crtsurfdata2.log文件显示出现乱码
来源:2-3 生成测试数据-加载站点参数

Caiverson
2022-06-18
老师您好,我想请问一下后续拆分字符串并用for循环输出vstcode每行信息的时候,日志crtsrrfdata2.cpp每一行中文都变成了乱码一样的文字,这个怎么解决?再在这之前单独显示一整行没切分之前的数据是正常的。
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);
就是不可以正常输出
8回答
-
一点积分
2022-07-28
确定了,是初始化的问题,没有初始化的情况下,使用类似printf那种写法,当从首行那个标题读取的时候,使用vi打开时会出现乱码的现象,加一个memset就行了,就不会出现乱码了。
老师的源码如果把memset和那个扔掉首行的一行命令行去掉,用vi打开也会出现乱码
大家使用数组时还是记得初始化,搞了我快1天了
自动判断中文中文(简体)中文(香港)中文(繁体)英语日语朝鲜语德语法语俄语泰语南非语阿拉伯语阿塞拜疆语比利时语保加利亚语加泰隆语捷克语威尔士语丹麦语第维埃语希腊语世界语西班牙语爱沙尼亚语巴士克语法斯语芬兰语法罗语加里西亚语古吉拉特语希伯来语印地语克罗地亚语匈牙利语亚美尼亚语印度尼西亚语冰岛语意大利语格鲁吉亚语哈萨克语卡纳拉语孔卡尼语吉尔吉斯语立陶宛语拉脱维亚语毛利语马其顿语蒙古语马拉地语马来语马耳他语挪威语(伯克梅尔)荷兰语北梭托语旁遮普语波兰语葡萄牙语克丘亚语罗马尼亚语梵文北萨摩斯语斯洛伐克语斯洛文尼亚语阿尔巴尼亚语瑞典语斯瓦希里语叙利亚语泰米尔语泰卢固语塔加路语茨瓦纳语土耳其语宗加语鞑靼语乌克兰语乌都语乌兹别克语越南语班图语祖鲁语自动选择中文中文(简体)中文(香港)中文(繁体)英语日语朝鲜语德语法语俄语泰语南非语阿拉伯语阿塞拜疆语比利时语保加利亚语加泰隆语捷克语威尔士语丹麦语第维埃语希腊语世界语西班牙语爱沙尼亚语巴士克语法斯语芬兰语法罗语加里西亚语古吉拉特语希伯来语印地语克罗地亚语匈牙利语亚美尼亚语印度尼西亚语冰岛语意大利语格鲁吉亚语哈萨克语卡纳拉语孔卡尼语吉尔吉斯语立陶宛语拉脱维亚语毛利语马其顿语蒙古语马拉地语马来语马耳他语挪威语(伯克梅尔)荷兰语北梭托语旁遮普语波兰语葡萄牙语克丘亚语罗马尼亚语梵文北萨摩斯语斯洛伐克语斯洛文尼亚语阿尔巴尼亚语瑞典语斯瓦希里语叙利亚语泰米尔语泰卢固语塔加路语茨瓦纳语土耳其语宗加语鞑靼语乌克兰语乌都语乌兹别克语越南语班图语祖鲁语百度翻译谷歌翻译谷歌翻译(国内)翻译朗读复制正在查询,请稍候……重试朗读复制复制朗读复制来源 谷歌翻译(国内)译242022-10-16 -
一点积分
2022-07-28
兄弟,我也出现了这个问题,但是我可以回答你最后一个问题,不是这个logfile.write不能这么写,而是ii不能等于0,我也测试了很多次。发现。
第一如果你不用vi编辑,采用cat命令查看或者视频中演示的tail命令查看日志文件,是完全没有问题的,都能正常显示。
第二如果你采用vi编辑,我目前验证发现,当ii=0时,后续日志的写入中就会出现乱码, 将数据进行切分后,尝试不进入循环,单出一行ii=0时,写入日志文件。实测发现会出现乱码。此时将ii=1代入原行,实测发现乱码情况消失。
第三 后续进行测试,循环中将ii初始化为1,编译运行文件后,实测采用vi打开日志文件没有出现乱码。
问题分析:采用cat或者tail时发现,当ii=0时,第一个字符直接将4个中文标题读取了,后续为0.
猜测:vi编辑器中的环境参数未设置好等其他原因,导致在i=0时读取前面标题时 后续为空,导致首行读取失败,显示乱码。
解决办法:直接一步到位,不取第一行标题 的无效数据,令ii=1开始,实测解决。‘
附:但是其中具体原因确实不是很清楚,只能是猜测和读取第一行数据时,未有有效值造成,猜测另外命令和vi不属于同一类别,所以能够正常显示。
译 10 -
长歌_吴从周
2022-10-16
这不是程序功能的问题,肯定是字符集的问题。
课程要求操作系统、数据库和SecureCRT的字符集都用utf-8,你再认真检查一下。
00 -
ModelSue
2022-08-02
兄弟你解决了吗,为啥我还没有解决呢
00 -
一点积分
2022-07-28
译 012022-07-28 -
长歌_吴从周
2022-07-28
我看不出来,要调试了才知道,你直接用我的代码测试看有没有问题。
032022-07-28 -
蜗牛7150515
2022-06-24
兄弟,你解决了吗,我也是这个问题022022-07-30 -
长歌_吴从周
2022-06-18
乱码是由环境变量和参数引起的,与代码无关。
解决这个问题很容易,你可能对linux不太熟悉,才会觉得麻烦。
你加入665410399群中来,方便沟通,如果解决不了,私信我。
我不清楚你乱码的原因,看不出来。
022022-06-21
相似问题