我的程序正在解析纯文本文件并正在运行。下一个代码是文本文件。
/*main.txt*/
_function main()
{
a = 3; //a is 3
b = "three";
c = 4.3; //automatic typecast
_outd(b+"3\n");
_outd(b+a+c);
d = a/c;
_outd("\n"+d+"\n"); ///test commantation
/*//
comment
*/
}
它是一种简单的c-styple脚本,可以在像记事本这样的文本编辑器中编辑。(本文中的内容并不重要)
文本开放代码。
std::wstring wsFileName; //from
char* sz_FileName = new char[wsFileName.size()+1];
ZeroMemory(sz_FileName,sizeof(char)*(wsFileName.size()+1));
//////////////////////////////////////////////////////////////////////////
//for using 'fopen', change wsFileName to ascii
WideCharToMultiByte(CP_UTF8,0,wsFileName.c_str(),-1,sz_FileName,wsFileName.size(),NULL,NULL);
//open ascii text file
FILE* fp=fopen(sz_FileName,"rt");
std::string ch;
while(!feof(fp))
{
ch.push_back(fgetc(fp)); //get textfile in ascii
}
在调试器中观察std::string ch
:
这与我在Windows 7中预期的结果完全相同。而发布执行文件也可以正常工作。但在Windows XP SP3中,它会调用运行时错误。
我整整一夜挖了,最后我发现了它。我在windows xp sp3上安装了visual studio 2008 sp1并对其进行了调试。观看std::string ch
:
我猜测“换行标记”是该程序在windows xp中崩溃的原因。我猜这个问题基于'Windows 7和Windows XP之间的文本编码'。所以我使用windows xp的记事本制作新的脚本文本。并尝试解析它。但是windows xp也存在同样的问题。我知道:问题不仅发生在文本文件orignated Windows 7,而且还发生在Windows XP中新生成的文本。我不知道为什么会出现问题。
生成任何Windows操作系统(xp& vista& 7)的纯文本文件(由记事本,editplus,ultraedit等生成...),我的程序如何读取该文本相同的结果?
我希望每个用户都可以编辑脚本,使用他们自己的简单文本编辑器在自己的操作系统中控制和自定义我的程序。
答案 0 :(得分:0)
为什么在添加到字符串之前不测试char,如果它包含不需要的字符?例如。类似的东西:
char temp;
while(...)
{
temp = fgetc(fp);
if (temp != "\r")
ch.push_back(temp);
}
我没有测试过代码,但如果“错误”的字符确实是“\ r”,它应该可以工作。